Linuxとコマンドラインの基礎
SSH で接続したサーバで、時間のかかる処理を「./run.sh &」で起動してから接続を切ったところ、処理も止まってしまった。接続を切った後も処理を続けさせる起動のしかたとして、最も適切なものはどれか。
- A./run.sh > run.log 2>&1 &
- Bnice -n 19 ./run.sh > run.log 2>&1 &
- Cnohup ./run.sh > run.log 2>&1 &
答えと解説を見る
正解:C. nohup ./run.sh > run.log 2>&1 &
接続が切れると、端末のハングアップを知らせる SIGHUP がシェルに送られ、bash などのシェルは自分のジョブにも SIGHUP を送ります。SIGHUP を受け取ったときの既定の動作は終了なので、バックグラウンドのジョブも止まります。nohup はコマンドが SIGHUP を無視するようにして起動し、出力をファイルに向けておけば、接続を切った後も処理が続きます。出力をリダイレクトせずに端末から起動すると、nohup は出力を nohup.out というファイルに書き込みます。tmux や screen のような端末多重化のソフトを使い、後で同じ画面につなぎ直す方法もよく使われます。
- A. 出力をファイルに向けても、SIGHUP を受け取ると処理は終了します。
- B. nice -n 19 は処理の優先度を下げて起動するだけで、SIGHUP への反応は変わりません。
- C. 正しい。nohup で SIGHUP を無視させ、出力はファイルに残します。