我一直试图在我的node.js应用程序中捕获关闭命令,以便可以在杀死该应用程序之前整理连接。
在生产中,我的应用程序使用docker swarm,我可以看到SIGTERM已通过以下方式触发:
process.on('SIGTERM', function() {});
但是,在我的开发环境中,我正在使用docker-compose run
和docker-compose down
,这似乎并不会触发我的 SIG * 捕获(我有一个本地版本关闭时, SIG 事件也会发布在RabbitMQ运行中。
我正在Dockerfile中运行 ubuntu:bionic 映像,并且在docker-compose文件中,我具有 init:true 。我的Docker引擎为 18.09.2 ,compose为 1.23.2 ,compose文件顶部的 version:“ 3.7” 。>
这些都是我的index.js中的所有捕获事件:
process.on('exit', () => {
reporter.ossEvent('APP STOPPED exit');
shutdown();
});
process.on('SIGINT', () => {
reporter.ossEvent('APP STOPPED SIGINT');
shutdown();
});
process.on('SIGTERM', function() {
reporter.ossEvent('APP STOPPED SIGTERM');
shutdown();
});
process.on('SIGUSR1', () => {
reporter.ossEvent('APP STOPPED SIGUSR2');
shutdown();
});
process.on('SIGUSR2', () => {
reporter.ossEvent('APP STOPPED SIGUSR2');
shutdown();
})
答案 0 :(得分:1)
#!/bin/bash
set -e
_kill_procs() {
kill -TERM $node
}
# Relay quit commands to processes
trap _kill_procs SIGTERM SIGINT
dumb-init -- node ./build/index.js $@ &
node=$!
#sleep infinity
echo 'Starting node process now'
wait $node
上面的代码是听SIGTERM和SIGKILL并杀死节点