長時間のバッチ実行をリモートのサーバーで実行し、
放置しておきたい場合の手順を解説する。
sshログアウトするとプロセスがkillされてしまう
&
を利用して単純にバックグラウンドで実行するだけの場合、
sshログアウトするとそのプロセスはkillされてしまう。
これはsshログインしたときのシェルの子プロセスとして稼働しているため、
ログインシェルを終了した際、HUPシグナルが送信されてしまうためである。
今回のポイントは2つだ。
- バックグラウンドで実行すること
- HUPシグナルが送信されても、プロセスが終了しないようにすること
コマンドを実行する前の場合
まだコマンドを実行する前なら、nohup
コマンドが利用できる。
nohup
コマンドは、HUPシグナルを無視するように処理を実行するコマンドである。
そのため、nohup
コマンドと&
を組み合わせることで
sshログアウトしても処理を継続することができる。
$ nohup 時間のかかるコマンド &
- 末尾の
&
:コマンドをバックグラウンドで実行する nohup
:端末を閉じてもログアウトしても処理を続行する
既にコマンドを実行してしまった場合
既にコマンドを実行してしまった場合は、以下の手順が必要になる。
- 一旦処理を中断する
- バックグラウンドで起動する
- ジョブテーブルから削除し、ログインシェルの管理対象外にする
一旦処理を中断する
現在実行中の処理を中断するには「Ctrl + z」で可能だ。
バックグラウンドで起動する
bg
コマンドを利用して、バックグラウンドで実行する。
$ bg
ジョブテーブルから削除し、ログインシェルの管理対象外にする
disown
コマンドを利用することで、現在のジョブテーブルから除外することができる。
# ジョブの番号を確認
$ jobs
# ジョブの番号が1番だったら%1を指定
$ disown %1
まとめ
- コマンド実行前:
nohup 実行したいコマンド &
- 実行してしまった後
- 一旦処理を中断
- バックグランドで起動
- ログインシェルの管理対象外にする
- ログアウト