9
28
2017
9

To hup or not to hup

本文来自依云's Blog,转载请注明。

故事起源于同事想在后台跑一个服务:

$ 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!

Category: Linux | Tags: nodejs linux bash shell | Read Count: 11664
mono 说:
Oct 12, 2017 11:33:07 AM

原来nohup直接exec后面程序了,我以前一直以为他是在子进程中执行后面程序的。谢谢提醒。

Horo 说:
Oct 21, 2017 08:36:37 PM

#importance_of_systemd (

zbinlin 说:
Oct 21, 2017 09:41:04 PM

哪个版本的 ndoe.js 有这个问题?我服务器上跑的 FQ 脚本就是用这种方式运行,记得上面 node.js 的版本好像 4+ 吧

Avatar_small
依云 说:
Oct 22, 2017 01:41:23 PM

Arch 写作时的版本就有这个问题(我看的此版本的源码)。我们服务器上的版本我得去看了才知道(而且可能已经被升级过了)。

clino 说:
Nov 08, 2017 05:10:14 PM

我一般开一个screen放在里面跑...

flip diving 说:
Nov 11, 2017 04:09:20 PM

This page gives you a lot of information. Thank you!

朱莉 说:
Dec 19, 2017 02:14:50 PM

遇到过这个问题,改用PM2来管理node进程了

yurenchen 说:
Jul 03, 2019 02:21:15 PM

记得 ubuntu 和 centos 的 bash 退出行为还不一样


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com