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

Linuxコマンド シェルスクリプト

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

sshログアウトするとプロセスがkillされてしまう

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

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

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

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

コマンドを実行する前の場合

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

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

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

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

既にコマンドを実行してしまった場合

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

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

一旦処理を中断する

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

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

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

$ bg

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

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

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

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

まとめ

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