0

我们正在使用 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,因此无法干净地关闭。

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

4

1 回答 1

0

事实证明,我必须从不同的角度来处理这个问题,并通过 Upstart 来处理它。添加一个 pre-stop 脚本,让我能够识别 Screen 会话,然后在命令中填充(“quit\n”然后是“y\n”)以干净地关闭 Screen 正在运行的二进制文件。

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
于 2014-02-25T00:49:27.283 回答