故事起源于同事想在后台跑一个服务:
$ nohup node xxx.js &
一切如愿。
——是吗?
实际情况是,这时退出 bash 是如愿了,但是直接关掉终端窗口的话,那个服务会死掉。
bash 奇怪行为之五
(我好像没有写前四个耶。等有时间了简单写一下吧。)
man bash 然后搜索 SIGHUP,你会发现,其实默认设置,bash 正常退出时,根本不会杀害后台进程。它们会和从脚本里运行时一样欢快地继续跑下去。只有 bash 因为收到 SIGHUP 而退出时,它才会给后台进程发 SIGHUP。
所以,直接 Ctrl-D 或者 exit 退出的话,(处理好了重定向的话,)要不要 nohup 都一样,进程不会死。
zsh 默认退出时会给后台任务发送 SIGHUP(除非你 disown 了)。
但这还是不能解释关窗口的时候,服务为什么会死掉呀?nohup 不是已经忽略掉 SIGHUP 了么?
与众不同的 nodejs
通常情况下,nohup 工作得很好。但是,UNIX 世界里来了位不了解、也不愿意遵循 UNIX 传统惯例的年轻气盛的小伙子。
我还记得 npm 直接往 /usr 下安装东西。
我还记得 npm 把 http_proxy 当 https_proxy 而我的缓存代理不支持 HTTPS,造成无法安装任何东西。
现在,nodejs 将所有信号的处理重置为默认行为,除了它自己想处理的那几个。
「nohup?那是什么鬼?我搞不懂!」nodejs 说,然后它被 SIGHUP 杀死了。
结语
The devil is in the detail!