sshでSIGHUPを無視する nohupするとログアウトしてもプロセスが終了せず継続

ITで知っておくべき知識
スポンサーリンク

sshでログインして、ある長時間かかるプロセスを実行したとします。

sshは適当な時間でタイムアウトして自動的にログアウトすると、そのプロセスも終了してしまいます。

これを防ぐのが nohup です。

スポンサーリンク

sshログウアウトするとプロセスが止まる理由

HUP(SIGHUP) とは番号1のシグナルで、ハングアップの意味です。

制御している端末/プロセスがハングアップした場合にプロセスに送られれます。

端末を使用するプロセスは、このシグナルを受け取ると終了します。

 

例えば、sshログインしている状態でバックグランドでシェルスクリプトを実行したとします。

この場合、sshdのログインシェル(bash)の子プロセスとしてシェルスクリプトが実行されます。

 

sshのログアウトを行うと、システムはシェルスクリプトにハングアップシグナル(HUP)を送信します。

結果として、シェルスクリプトが終了します。

nohup とは

端末を閉じたりログアウトしたりしても処理を続行させるためには、HUPシグナルを受けても無視するようにすればよいです。

これを行うのが、nohup です。

nohupの読み方は、ノーハップです。

 

nohupの使い方ですが、以下のようにコマンドを実行します。

$ nohup コマンド &

 

&の意味は「バックグラウンドで実行する」です。

バックグラウンドで実行するように、&を忘れないように付けておきましょう。

 

nohup & を忘れた

nohupを忘れた場合、 disown コマンドを使うと、指定のジョブに SIGHUP が送られないようにすることができます。

 

フォアグランドで実行中のジョブを

1. ctrl+z で一時停止する
2. $ bg でバックグラウンドで実行する
3. $ disown -h [jobnumber]

 

[jobnumber] は %1 のようにジョブ番号を指定します。

ジョブ番号は jobs コマンドで確認してください。

 

 

コメント