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 コマンドで確認してください。
コメント