エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。
サイトをリニューアルしました

【Linux】sshログアウトしてもコマンドをバックグラウンドで実行する

目的

長時間のバッチ実行など時間のかかるコマンドをリモートのサーバーで実行し、
放置しておきたい場合の手順を解説する。

  1. まだコマンドを実行していない場合
  2. 既にコマンドを実行してしまった場合

の2パターンに分けて解説する

注意:&を使っただけではダメ

$ 時間のかかるコマンド &

上記のように、&を利用して単純にバックグラウンドで実行するだけの場合、
sshログアウトするとそのプロセスはkillされてしまう。

これはsshログインしたときのシェルの子プロセスとして稼働しているため、
ログインシェルを終了した際、HUPシグナルが送信されてしまうためである。

今回のポイントは2つだ。

  • バックグラウンドで実行すること
  • HUPシグナルが送信されても、プロセスが終了しないようにすること

パターン1:コマンドを実行する前の場合

まだコマンドを実行する前なら、nohupコマンドが利用できる。

nohupコマンドは、HUPシグナルを無視するように処理を実行するコマンドである。

そのため、nohupコマンドと&を組み合わせることで
sshログアウトしても処理を継続することができる。

$ nohup 時間のかかるコマンド &
  • 末尾の&:コマンドをバックグラウンドで実行する
  • nohup:端末を閉じてもログアウトしても処理を続行する

パターン2:既にコマンドを実行してしまった場合

既にコマンドを実行してしまった場合は、以下の手順が必要になる。

  1. 一旦処理を中断する
  2. バックグラウンドで起動する
  3. ジョブテーブルから削除し、ログインシェルの管理対象外にする

①実行中の処理を一時停止する

現在実行中の処理を中断するには「Ctrl + z」で可能だ。

これは一時停止状態になるだけなので安心してほしい。

②バックグラウンドで起動する

bgコマンドを利用して、バックグラウンドで実行する。

$ bg

③ジョブテーブルから削除し、ログインシェルの管理対象外にする

disownコマンドを利用することで、現在のジョブテーブルから除外することができる。

# ジョブの番号を確認
$ jobs

# ジョブの番号が1番だったら%1を指定
$ disown %1

まとめ

  • コマンド実行前:nohup 実行したいコマンド &
  • 実行してしまった後
    1. 一旦処理を中断
    2. バックグランドで起動
    3. ログインシェルの管理対象外にする
    4. ログアウト