ログアウトした後もプログラムの処理を続ける?(コマンド実行時にnohup)
nohup コマンドを使うとログアウト時に処理を停止させないでプログラムを続けるようにさせることができる。という説明をよくみかけますが、実際には、nohup を使わなくても、プログラムを「&」を使ってバックグラウンドで処理していれば、ログアウト後も起動されたプログラムはそのまま処理を継続します。
nohupコマンドを使うと、例えばターミナルが突然切断された等の理由でシェルがHUPシグナルを受け終了した場合でも処理を続けることができるようになります。
Last Update : 2014年03月19日
ログアウトした後もプログラムの処理を続ける?(コマンド実行時にnohup) 項目
1. nohup コマンド
nohup コマンドは、ハングアップシグナル(SIGHUP, HUP)を無視するかたちでコマンドを実行させるコマンドです。
例えば、ターミナルが突然切断された等の理由(TeraTermを×で閉じるとか、切断するとか)でクローズされる場合、その端末から起動されたプロセスグループにはHUPシグナルが送信されます。このHUPシグナルを受けて、それまで実行していたプログラムは終了しますが、nohup コマンドを使ってプログラムを実行した場合は、このHUPシグナルを無視するので、結果、そのプログラムは処理を続けます。
memo
bash、tcsh、ksh をデフォルト設定のまま使っていれば、'&'をつけてコマンドを実行するだけでログアウトしても処理は継続されます。zshの場合はログアウト時もHUPシグナルが送信されますので、処理は終了します。
bashを使っていても、以下のように、
# shopt -s huponexit ← huponexitをONに変更。OFFにするには、「-u」オプションを使う
の設定をあらかじめしてあるとログアウト時にHUPシグナルが送信されます。
zshを使っていたり、huponexit が on になっていたりする場合で、ログアウト後も処理を継続したい場合は、nohupを使います。
書式
nohup command [arg...]
※ nohup コマンドは自動的にはコマンドをバックグランドに送らないので、コマンドラインの末尾に& をつける。
例
# nohup find / -name test.txt & ← & をつけてバックグラウンドで実行。 [1] 32549 nohup: ignoring input and appending output to `nohup.out'
ここでターミナルを切断します。今回はTeraTermの「接続断」を使いました。
別の端末からプロセスを確認
# ps -ef | grep find
root 32549 1 2 08:55 ? 00:00:03 find / -name test.txt ← ログアウト後も処理継続中。
root 32579 32555 0 08:57 pts/1 00:00:00 grep find
memo
nohup を使ってコマンドを実行した場合、実行したコマンドの標準出力、標準エラー出力は、nohup.out ファイルに追記の形をとってリダイレクトされます。
nohup.out に書き込みができない場合は、$HOME/nohup.out に。$HOME/nohup.outも書き込みができなければコマンドは実行されません。
root ユーザーで、user1のホームディレクトリにnohup.outを作成
# touch ~user1/nohup.out # ls -l ~user1/nohup.out -rw-r--r-- 1 root root 0 3月 19 08:19 2014 /home/user1/nohup.out ← nohup.out ファイルには、user1の書き込み権限はない。
user1 ユーザーで、nohupコマンドを使ってみる
$ whoami user1 $ nohup find / -name test.txt & [1] 3349 $ nohup: failed to open `nohup.out': 許可がありません ← nohup.out に書込み権限なし nohup: failed to open `/home/user1/nohup.out': 許可がありません ← $HOME/nohup.out に書込み権限なし [1]+ 終了 125 nohup find / -name test.txt ← コマンドが終了させられる