/ / 最新 / 2009-10 / RSS / twitter / tumblr / 09014502501 / mail@ssig33.com

高密度小池


zsh の謎の挙動に悩まされていました

nohup unko

としてプログラムを起動した場合、端末を閉じたり exit コマンドを発行した場合にもそのまま動いていて欲しいものですが、 zsh 上ではこれも終了されてしまう。

しかし、シェルスクリプトを書いてその中で nohup していた場合は端末や zsh を殺しても大丈夫。

ちょっと調べたら答えがあった。

端末を殺した場合のフロー

端末が殺される→中で実行しているシェルに SIGHUP が送られる→シェルがよろくやる

んでこれが bash の場合は

SIGHUP を送らない

のだけど zsh の場合は

子プロセス全部に問答無用で SIGHUP を送る

ので、 nohup していても殺されてしまう。

シェルスクリプトの中で nohup していて死なないのは、

端末の死→ zsh にSIGHUP が来る → zsh は子プロセスのシェルスクリプトを実行している sh に SIGHUP を送る→ sh は nohup してる子プロセスに SIGHUP を再送したりしない

という理由から。

対策

setopt nocheckjobs

こうすると SIGHUP を送ったりしなくなる

あるいは

unko &!

とすると、 unko は job table から外された形で起動するので SIGHUP の嵐に巻き込まれず幸福実現する。

job table から落すのは行儀が悪い気がするので nocheckjobs するのがいいのではないかと思う。

via. http://d.hatena.ne.jp/lurker/20070220/1171932797

blog comments powered by Disqus

Referrer (Inside):

[ 固定リンク ]