shell と SIGHUP

id:lurker さんのブックマークコメントから

disownはSIGHUP無視するようにします。bgとはちょっと違うものだと思います。/gdb使えば入出力は差し替えれそう。

だよね、とか思いつつ(gdbを使った端末差し替えは気になるけどとりあえずスルー)、zshtcsh で試す。
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 以外は同じ挙動だし、混乱の元ではあるな。