nohup ログアウトしてもコマンドが止まらないように実行する
nohup コマンド [引数...] [&]試してみる
nohup sleep 300 >/dev/null 2>&1 &sleep を、ハングアップ(SIGHUP)を無視する状態でバックグラウンドで起動します。出力は捨てます。
ps -C sleep -o pid,ppid,stat,cmd起動したプロセスが動いていることを確認します。
nohup sh -c 'echo 処理が終わりました' >job.log 2>&1 &出力をファイルに書き出す形で、バックグラウンドで実行します。
sleep 1; cat job.log出力がファイルに残っています。
grep SigIgn /proc/$(pgrep -o -x sleep)/statusプロセスが SIGHUP を無視する設定になっていることを調べます(SigIgn の値の末尾が奇数なら SIGHUP を無視しています)。
pkill -x sleep後始末として、起動した sleep を終了させます。
主なオプション
コマンド & | 末尾に & を付けて、バックグラウンドで実行する(nohup 自体にはバックグラウンドにする働きはない) |
|---|---|
> ファイル 2>&1 | 標準出力と標準エラー出力をファイルに書き出す |
--help | 使い方を表示する |
解説
SIGHUP を無視する
端末を閉じたりログアウトしたりすると、その端末で動いているプロセスに SIGHUP(ハングアップ)というシグナルが送られ、通常は終了してしまいます。nohup を付けて起動したコマンドは、SIGHUP を無視するので、ログアウトしたあとも動き続けます。時間のかかる処理を、接続を切っても走らせておくときに使います。
バックグラウンドにするのは & の役割
nohup 自体は、コマンドをバックグラウンドにしません。実行中の端末を占有させたくないときは、末尾に & を付けます。nohup 処理 & が定番の形です。
出力の行き先
標準出力が端末のままだと、nohup は出力を nohup.out というファイルに追記します(書き込めなければ $HOME/nohup.out)。そのとき nohup: ignoring input and appending output to 'nohup.out' というメッセージが出ます。標準出力が端末でなければ、nohup.out は作られません。ファイルの名前を決めたいときや、出力が要らないときは、> ファイル 2>&1 や >/dev/null 2>&1 で自分でリダイレクトします。
試験でのポイント
nohup は、SIGHUP を無視させるコマンドです。その他にも、screen や tmux を使うと、切断しても処理を継続でき、あとから接続し直せます。ジョブを実行中の bg や jobs と合わせて覚えておきましょう。