はじめに
バックグラウンドジョブを起動したプロセス(ログインシェル)を終了すると子プロセスであるバックグラウンドジョブをハングアップシグナル(HUP)によって終了させる。
親プロセスであるシェルが終了すると子プロセスはゾンビプロセスとなってしまうので、親プロセスは子プロセスであるバックグラウンドジョブを kill(kill -HUP) する。
nohup コマンド
$ nohup ./process.sh &
バックグラウンドジョブをログアウト後も実行させる場合は nohup コマンドを使う。
nouhp コマンドはLinux以外のUnix系のOSなら大概使える。
もしも無かったら GNU の coreutils にある。
処理中に出力されたメッセージはプログラムを実行したディレクトリの nohup.out に出力される。
プログラムを実行したディレクトリに書き込み権限がなければ $HOME/nohup.out に出力される。
& はプロセスをバックグラウンドで実行するという意味。
標準出力先を指定する
$ nohup ./process.sh > out.log &
標準出力先が out.log になる。
標準エラー出力は普通に使った時と同じように nohup.out に出力される。
標準エラー出力先を指定する
$ nohup ./process.sh > out.log 2> err.log &
標準出力先が out.log になる。
標準エラー出力先は err.log となる。
実行中のプロセスを終了する
nohup で実行中のプログラムを終了させるにはプロセスIDを調べて kill コマンドで強制終了する。
disown コマンド
ログアウトしたいのに nohup コマンドをつけずにジョブを開始してしまった場合には disown コマンドを使う。
jobs コマンドでジョブ番号を確認して disown コマンドの引数に指定する。
$ jobs
[1]+ Running process.sh
$ disown %1
ジョブ番号を指定せずに実行したすると現在のジョブを、オプションで -a(--all)を指定すると全てのジョブをデーモンプロセス化する。
最後に
tmux とか screen 使った方が楽