やりたいこと
DBのバックアップなど、数時間かかるコマンドをバックグラウンドで実行したい。
しかしコマンドの中にはssh接続のログアウト時や不慮の回線切断時に途中終了されてしまうものもある。
そこで途中終了されないようにコマンドを実行したい。
手順
nohupコマンドと&を使用する。
$ nohup {コマンド} &
nohup
nohupにより実行されたコマンドは、HUPシグナルを受け付けなくなる。
HUPシグナルはssh接続切断時にプロセスに送られ、プログラムを途中終了させる。
&
コマンドの末尾に&を追加すると、プロセスがバックグラウンド実行される。
もし後からバックグラウンド実行したい場合、以下手順を行う。
- Ctrl + zでプロセスを途中停止
- bgコマンドで途中停止したプロセスをバックグラウンド実行
disown
$ {コマンド} & $ disown
nohupを使用しない場合、disownコマンドを使用する。
disownはジョブテーブルから対象のジョブを削除しプロセスとしてのみ残す。
そのためssh接続切断時にHUPシグナルが送らなくなる。
もしバックグラウンドプロセスが複数ある場合、jobsコマンドでdisownするプロセス番号を確認する。
$ jobs $ disown %{対象のジョブ番号}
-hオプション
対象ジョブをジョブテーブルに残しつつHUPシグナルのみ受け付けないようにすることもできる。
その場合、disownにhオプションを付ける。
disown -h