让Gnu Screen将SIGTERM信号传递给子进程,允许它们干净地关闭
问题描述:
我们使用Upstart来启动/终止内部开发的二进制文件。让Gnu Screen将SIGTERM信号传递给子进程,允许它们干净地关闭
在这个二进制新贵配置文件,我们定义脚本,例如:
script
exec su - user -c "screen -D -m -S $product /opt/bin/prog /opt/cfg/$product -v 5 --max_log_size=7"
end script
当运行级别设置为5,新贵启动脚本。运行级别设置为3时,Upstart终止脚本。
我的问题是,Upstart发送SIGTERM,然后SIGKILL。
SIGTERM由屏幕“处理”,而不是由我的自定义二进制文件处理,所以我们的二进制信号处理程序不会得到SIGTERM,因此无法干净地关闭。
我已验证我们的二进制信号处理程序确实允许它在通过屏幕不启动时干净地关闭。
答
原来,我不得不从另一个角度来看待这个问题,并通过Upstart处理它。增加了一个预停脚本,允许我识别屏幕会话,然后填入命令(“quit \ n”,然后“y \ n”)以干净地关闭屏幕正在运行的二进制文件。
pre-stop script
SESSID=`ps -elf | grep '/opt/bin/prog /opt/cfg/$product' | grep SCREEN | awk '{print $4}'`
QUIT_CMD="screen -S $SESSID.$product -X stuff \"exit"$'\n'"\""
exec `su spuser -c "$QUIT_CMD"`
QUIT_CMD="screen -S $SESSID.$product -X stuff \"y"$'\n'"\""
exec `su spuser -c "$QUIT_CMD"`
sleep 20
end script