【问题标题】:How systemd stop command actually workssystemd stop 命令的实际工作原理
【发布时间】:2017-08-16 03:27:14
【问题描述】:

我正在使用一个 systemd 服务,它在“启动”时调用一个进程(例如 $systemctl start test.service)。根据设计,进程永远处于循环中,我们可以使用“ps”命令查看进程的存在。我们还看到该进程被 systemctl stop 命令杀死(如预期的那样)。 但是我们的要求是,我们希望在进程被杀死之前从进程中执行一些安全的关闭操作。但我不确定如何从进程中检测到 systemd 停止操作。

systemctl stop test.service 命令是否发送 SIGKILL 或 SIGTERM 信号来终止进程?如何从进程中检测 systemctl stop 操作?

【问题讨论】:

    标签: systemd


    【解决方案1】:

    默认情况下,会发送 SIGTERM,然后等待 90 秒,然后再发送 SIGKILL。

    使用systemd 杀死进程是非常可定制且有据可查的。

    我建议阅读所有man systemd.kill 以及阅读有关ExecStop= in man systemd.service 的内容。

    要响应这些信号,请参阅您使用的语言的信号处理文档。

    【讨论】:

    • 值得注意的是:如果主进程在超时之前停止,systemd 将向所有子进程发送 SIGKILL,如果还有剩余的话。如果超时,它将向整个控制组发送 SIGKILL。
    【解决方案2】:

    systemctl stop test.service 命令是否发送 SIGKILL 或 SIGTERM 信号来终止 过程?如何从进程中检测 systemctl stop 操作?

    Systemd 向进程发送 SIGTERM 信号。在处理过程中,您必须注册“捕获”的信号。

    正在处理中,例如。 SIGTERM 信号可以这样注册:

    void signal_callback()
    {
        printf("Process is going down\n");
    }
    signal(SIGTERM, signal_callback)
    

    当 SIGTERM 被发送到进程时 signal_callback() 函数被执行。

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多