Linux 为什么不是';t node.js是否能够从upstart脚本捕获SIGTERM?
当我停止一个暴发户作业时,默认情况下它使用SIGTERM。我在node.js中找到了如下术语: 我通过从终端运行它并发送Linux 为什么不是';t node.js是否能够从upstart脚本捕获SIGTERM?,linux,ubuntu,upstart,Linux,Ubuntu,Upstart,当我停止一个暴发户作业时,默认情况下它使用SIGTERM。我在node.js中找到了如下术语: 我通过从终端运行它并发送kill-s SIGTERM[pid]验证了这一点。这会触发正常关机,我在日志中看到了它 我有一个像这样的暴发户脚本: #进程将在网络可用后启动。 从运行级别开始[2345] 在运行级别停止[016] #保持服务器运行 重生 重生限额5 30 #等待5分钟,让服务器正常关闭 终止超时300 #允许正常关机 杀伤信号信号项 正常退出0 SIGTERM SIGINT SIGQU
kill-s SIGTERM[pid]
验证了这一点。这会触发正常关机,我在日志中看到了它
我有一个像这样的暴发户脚本:
#进程将在网络可用后启动。
从运行级别开始[2345]
在运行级别停止[016]
#保持服务器运行
重生
重生限额5 30
#等待5分钟,让服务器正常关闭
终止超时300
#允许正常关机
杀伤信号信号项
正常退出0 SIGTERM SIGINT SIGQUIT
chdir/var/web\u服务器
剧本
#环境变量
. /etc/环境
导出节点环境
#将所有stdout和stderr设置为转到命名管道
mkfifo/tmp/log fifo
(记录器-t网络/tmp/log fifo
rm/tmp/log fifo
node server.js--env=“$node\u env”2>&1
结束脚本
当我开始工作时,一切都很好。当我停止作业时,节点进程立即终止,节点从不处理SIGTERM信号
如果我将upstart conf更改为kill signal SIGINT
,则节点进程将获得SIGINT并正常关闭。WTF
为什么SIGINT工作正常,而SIGTERM工作不正常?为什么我的节点进程在从终端运行时完全能够捕获SIGTERM,但在通过Upstart运行时却不能,而且它能够捕获SIGINT?这是Upstart中的怪癖还是bug
process.on('SIGTERM', shutdownServerGracefully);
process.on('SIGINT', shutdownServerGracefully);
# 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