当我停止一个暴发性的工作时,默认情况下它使用SIGTERM。 我已经在node.js中捕获了SIGTERM,如下所示:
process.on('SIGTERM', shutdownServerGracefully); process.on('SIGINT', shutdownServerGracefully);
我通过从terminal运行并发送kill -s SIGTERM [pid]
validation了这一点。 这触发了正常关机,我在日志中看到它。
我有一个像这样的新贵脚本:
# Process will start after a network is available. start on runlevel [2345] stop on runlevel [016] # Keep server running respawn respawn limit 5 30 # Wait 5 minutes for server to gracefully shutdown kill timeout 300 # Allow for graceful shutdown kill signal SIGTERM normal exit 0 SIGTERM SIGINT SIGQUIT chdir /var/web_server script # Environment variables . /etc/environment export NODE_ENV # Setup all stdout and stderr to go to a named pipe mkfifo /tmp/log-fifo ( logger -t web < /tmp/log-fifo & ) exec > /tmp/log-fifo rm /tmp/log-fifo node server.js --env="$NODE_ENV" 2>&1 end script
当我开始工作时,一切正常。 当我停止工作时,节点进程立即被终止,节点从不处理SIGTERM信号。
如果我改变了upstart conf来终止kill signal SIGINT
,节点进程将得到SIGINT并正常closures。 WTF?
为什么SIGINT工作正常,但不是SIGTERM? 为什么我的节点进程完全能够从terminal运行时捕获SIGTERM,而不是在通过Upstart运行时捕获SIGTERM,但是却能够捕获SIGINT? 这是Upstart的一个怪癖或错误吗?