
長時間の計算を実行するプロセス (たとえば、数日間実行されている) があるとします。このプロセスでは、中間結果を格納するための一時ストレージとしてディスクが使用されます (たとえば、 にマウントされていて、に/mnt
置き換えたい場合)。そのプロセスを強制終了したり、あまり邪魔したりせずに、そのディスクを別のディスクに置き換えるにはどうすればよいですか?/dev/sda1
/dev/sdb1
これは特定のプログラムについてではなく、一般的な質問です。最新バージョンの Linux を実行しているとします。
答え1
プロセスが一時ファイルの作成と削除のために何らかのディレクトリを使用している場合は、kill -STOP $pid
コマンドを使用してプロセスを停止し、開いているファイル記述子の /proc/$pid/fd を確認することができます。
何も開かれていない場合は、マウント場所を安全に変更し、そのファイルをコピーして、作業を続行できますkill -CONT $pid
。
まだ開いているファイルやプロセスが閉じていないファイルがある場合は、GDB を使用してファイル記述子を移行してみてください。私は手動で試しましたが、うまくいきましたが、代わりに実行できるスクリプトを見つけました。http://ingvar.blog.redpill-linpro.com/2010/07/10/change-a-process-file-descriptor-on-the-fly/ プロセスファイル記述子をオンザフライで変更する
プロセスがネットワーク経由で通信している場合は注意してください。停止すると接続がタイムアウトする可能性があるため、できるだけ早く実行する必要があります (おそらく、事前にダミー プロセスでコマンド シーケンスをテストし、バッチとして実行します)。
うまくいくと思うけど、むしろお勧めしません本番環境で実行する必要があります。
編集: /proc/$pid/fd で開かれたネットワーク ソケットも確認できるため、プロセスがネットワークを使用しているかどうかを判断できます。
答え2
これは、一時ストレージを使用するときのプロセスの動作に完全に依存します。
プロセスが でファイルを開いたままにしている場合/mnt
、デバイスを強制的にアンマウントできたとしても、プロセスが何らかの未定義の方法で失敗する可能性が高くなるため、デバイスを置き換えることはできません。プロセスは通常、開いているファイルがあるデバイスが消えることを想定はしていません。
プロセスが を開いて書き込み、ファイルを閉じる場合/mnt
、 を停止し、 をアンマウントして再マウントし、再起動することで回避できる可能性があります/mnt
。これは、 が使用されていないときにプロセスを停止できるかどうかに依存します/mnt
。したがって、次のようにすることができます。
$ kill -STOP pid
$ lsof -p pid | grep /mnt
... then, if it has nothing open on /mnt ...
$ sudo umount /mnt
$ sudo mount /dev/sdb1 /mnt
$ kill -CONT pid
これは、ファイルを何も開いていない状態でプロセスを停止したとしても/mnt
、必ずしも機能するとは限りません。変更しないことを前提とするロジックを中断している可能性があるためです/mnt
。たとえば、
/mnt/wibble
存在するか確認する- そうです!開いて読んでみましょう
- ...プロセスが停止し、別のデバイスがマウントされます
/mnt
... - ...プロセスが再開します...
- ああ、
/mnt/wibble
開けられない! - ひどい死に方をする
答え3
数日間にわたって計算を実行するプログラムは、十分な状態を定期的にディスクにコミットするように設計する必要があります。プロセスの再起動によって 1 時間の処理時間が失われる場合は問題ありませんが、それ以上の時間が失われる場合は、そのプログラムは設計が不十分であると言えます。
そうは言っても、プロセスをより長く存続させ、その下のディスクを交換したいシナリオもあるかもしれません。そのような状況では、ファイルシステムを物理メディアから切り離すことを検討する必要があります。
考えられるオプションは次のとおりです:
- ソフトウェアRAIDを使用する
- 他の仮想ブロックデバイス層を使用する(おそらくLVMが適している)
- 複数の基盤デバイスを使用できるファイルシステムを使用する