shell と SIGHUP
id:lurker さんのブックマークコメントから
disownはSIGHUP無視するようにします。bgとはちょっと違うものだと思います。/gdb使えば入出力は差し替えれそう。
だよね、とか思いつつ(gdbを使った端末差し替えは気になるけどとりあえずスルー)、zsh と tcsh で試す。
zsh で。
% cat nohup.pl #!/usr/bin/env perl use strict; use warnings; $SIG{HUP} = sub { print "recieved SIGHUP\n"; exit; }; while (1) { sleep 10; } % ./nohup.pl & % exit zsh: you have running jobs. % exit recieved SIGHUP
background job だろうと、SIGHUP は送られるよね。
次に tcsh で。
% ./nohup.pl & % exit
あれ?tcsh の man を見ると、nohup の逆の hup があるらしい。
% hup ./nohup.pl & % exit recieved SIGHUP
どうも、tcsh はバックグランドジョブの場合には SIGHUP を送らないらしい。nohup とはまた違う動作だな(nohup は SIGHUP のハンドラを設定してから子プロセスを起動するのであって、シグナル自体は送られる)。
ということで、普段 tcsh を使っている人は bash/zsh を使わざるを得ない場合に同じことするとプロセスが終了するので注意すること。SIGHUP 以外は同じ挙動だし、混乱の元ではあるな。