让Gnu屏幕通过SIGTERM信号到子进程,允许他们干净地关闭

时间:2014-02-20 21:21:07

标签: c++ signals gnu-screen upstart sigterm

我们正在使用Upstart启动/终止内部开发的二进制文件。

在此二进制文件的Upstart配置文件中,我们将脚本定义为:

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时,Upstart会启动脚本。当运行级别设置为3时,Upstart将终止脚本。

我的问题是,Upstart正在发送SIGTERM然后发送SIGKILL。

SIGTERM由屏幕“处理”,而不是我的自定义二进制文件,因此二进制文件中的信号处理程序不会获得SIGTERM,因此无法完全关闭。

我已经验证了二进制文件中的信号处理程序是否允许它在未通过屏幕启动时干净地关闭。

1 个答案:

答案 0 :(得分:0)

原来我必须从不同的角度来看待这个问题,并通过Upstart处理它。添加一个预停止脚本,允许我识别屏幕会话,然后填写命令(“退出\ 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