2014年5月16日金曜日

nohupはどこにあるのか?

tcsh の場合 where を使ってみると、こうなります。(Debian Linuxで試しています。)
% where nohup
nohup is a shell built-in
/usr/bin/nohup
/usr/bin/X11/nohup
一方 bash の場合は where が無いので which -a を使ってみる。
$ which -a nohup
/usr/bin/nohup
/usr/bin/X11/nohup

というわけで、tcshのnohupはシェルビルトインコマンドであり、bashのそれは外部コマンドなのです。
そして挙動ですが、tcshの場合、manpageによると
デフォルトでは、シェルの子供たちもそうしますが、 シェルは終了時に HUP を子供たちに送りません。 hup はシェルが終了時に 子供に HUP を送るようにし、 nohup は子供がHUP を無視するように 設定します。
とのこと。一方bashの場合はshoptで確かめます。
$ shopt huponexit
huponexit       off
あれ? いずれにせよ、バックグラウンドジョブにhupが渡らないように見えます、 nohup無くても困らないんじゃない? などと思ってしまうのですが、実はそんな簡単な話でもないようです。

 技術 / UNIX / なぜnohupをバックグランドジョブとして起動するのが定番なのか?(擬似端末, Pseudo Terminal, SIGHUP他) http://www.glamenv-septzen.net/view/854

詳細についてはこちらの記事をお勧めします。勉強になります。