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