【问题标题】:Have Gnu Screen Pass SIGTERM Signal to Child Processes, Allowing Them To Shut Down Cleanly让 Gnu Screen 将 SIGTERM 信号传递给子进程,允许它们干净地关闭
【发布时间】:2014-03-22 02:35:19
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    事实证明,我必须从不同的角度来处理这个问题,并通过 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2021-10-23
      • 1970-01-01
      • 2017-04-05
      • 2011-08-13
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多