MENU

編集中に接続が切れた設定ファイルを復旧用の控えから取り戻す手順

SSH でサーバーにつないで設定ファイルを編集しているとき、ネットワークの瞬断やタイムアウトでセッションが突然終了することがあります。このとき、変更した内容がファイルに書き込まれたかどうかが不明なままになります。screen や tmux のセッションが残っていれば再接続できますが、セッションごと消えてしまった場合は、サーバー上に残った控えファイルが唯一の手がかりになります。

手がかりとなる控えには主に2種類あります。ひとつは vim が編集中に自動作成するスワップファイル(.swp ファイル)、もうひとつは編集前に cp コマンドなどで手動作成しておいたコピーです。以下では、それぞれの控えから変更を取り戻す手順と、作業後の片付けを順に説明します。

目次

現在のファイルの状態を確認する

控えから変更を取り戻す前に、現在の設定ファイルがどのような状態にあるかを把握しておきます。接続が切れたタイミングによっては、すでに保存が完了している場合もあるためです。いきなり上書きすると、完了していた保存を無駄にしてしまいます。

まずタイムスタンプで更新の有無を確認します。

ls -l /etc/nginx/nginx.conf

更新日時が編集を開始した時刻より前であれば、変更がファイルに書き込まれていない可能性が高いです。更新日時が新しくなっていれば、保存が完了しているか、途中まで書き込まれた状態です。

構文チェックコマンドが使えるサービスであれば、ファイルの内容が有効かどうかも確かめられます。nginx の場合は次のコマンドで確認できます。

nginx -t

エラーが出なければファイルは有効な状態です。構文エラーが出た場合は、書き込みが中途半端で終わっている可能性があります。この場合は後述の手順でバックアップから元の状態に戻します。

vim のスワップファイルから変更を取り戻す

vim は編集中、一定間隔でスワップファイルに変更内容を書き出しています。接続が切れても、このファイルがサーバーに残っていれば未保存の変更を取り戻せます。

スワップファイルは、編集対象ファイルと同じディレクトリに .ファイル名.swp という形式で作成されます。/etc/nginx/nginx.conf を編集していた場合は /etc/nginx/.nginx.conf.swp になります。隠しファイルも含めて一覧表示して存在を確認します。

ls -la /etc/nginx/

スワップファイルが見つかったら、次のコマンドで vim を復旧モードで起動します。

vim -r /etc/nginx/nginx.conf

vim が起動すると「スワップファイルが見つかった」という旨のメッセージが表示され、操作を選ぶよう求められます。r(Recover)を選択すると、スワップファイルの内容がバッファに読み込まれます。内容を確認し、意図した変更が含まれていれば :w で保存してから :q で終了します。

:wq

スワップファイルが複数存在する場合は、ファイル名なしで vim -r を実行するとリストが表示されます。対象のファイルを選んで復旧してください。

vim -r

なお、sudo でファイルを編集していた場合、スワップファイルの所有者は root になっています。一般ユーザーで vim -r を実行すると権限エラーになるため、sudo vim -r /etc/nginx/nginx.conf のように root 権限で実行する必要があります。

手動バックアップとの差分で状態を判断する

編集前に cp コマンドでバックアップを取っていた場合、そのコピーと現在のファイルを比較することで、変更がどこまで書き込まれているかを確認できます。

diff /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf

差分がまったく出なければ、変更がファイルに書き込まれていません。vim のスワップファイルが残っていれば前の手順で取り戻し、残っていなければ変更を再適用する必要があります。

差分に意図した変更が含まれていれば、切断前に保存が完了していたことがわかります。この場合、バックアップは不要になるため後で削除できます。

ファイルが壊れていて構文エラーが出る場合は、バックアップから元の状態に戻したうえで再編集します。

cp /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf

差分の出力が読みにくい場合は -u オプションで unified 形式にすると、変更箇所が前後の文脈とともに表示されて判断しやすくなります。

diff -u /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf

復旧後に控えファイルを片付ける

変更の取り戻しが完了し、設定ファイルが正しい状態になったことを確認したら、残っている控えファイルを削除します。スワップファイルを残しておくと、次回以降も vim を開くたびに復旧メニューが表示されるため、作業後は必ず削除してください。

スワップファイルを削除します。

rm /etc/nginx/.nginx.conf.swp

スワップファイルのファイル名が不明な場合は find で探せます。

find /etc/nginx -name ".*.swp"

手動バックアップも、設定ファイルが意図した状態になったことを確認してから削除します。

rm /etc/nginx/nginx.conf.bak

よくあるつまずきポイント

vim -r で開いた後に保存を忘れた

復旧モードでスワップファイルの内容をバッファに読み込んだだけでは、変更はファイルに書き込まれません。内容を確認したあとは必ず :w で保存してから終了してください。:q! で強制終了すると変更が失われます。

スワップファイルが見つからない

vim の設定(~/.vimrc の directory オプション)によっては、スワップファイルが編集対象ファイルとは別の場所に作成されることがあります。~/.vim/swap/ や /tmp も確認してみてください。

find ~ /tmp -name ".*.swp" 2>/dev/null

スワップファイルを開いても変更が入っていない

vim はデフォルトで約 4 秒ごとにスワップファイルを更新しますが、切断が起きたタイミングによっては最後の変更が反映されていないことがあります。スワップファイルの内容が古い場合は、差分を確認したうえで変更を再適用してください。

設定を反映する前に構文チェックを行う

復旧した設定ファイルをサービスに反映する前に、構文チェックを実行しておくと安全です。nginx であれば nginx -t、sshd であれば sshd -t、Apache であれば apachectl -t で確認できます。エラーなく通ったことを確認してからサービスを再起動してください。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次