当系统要重新启动时,进程可以获得哪个信号(如 SIGINT 或 SIGTERM)?

当系统要重新启动时,进程可以获得哪个信号(如 SIGINT 或 SIGTERM)?

我的应用程序需要在退出之前做一些事情,我已经通过处理 的 信号来处理 ctrl-c 情况SIGINT,但我还想在系统要重新启动时处理这种情况。

我研究了一下,但发现SIGTERM是通过管理操作,系统在重新启动之前不会发送SIGTERM,这是正确的吗?

我还可以处理其他信号吗?

编辑:如果我的应用程序由 运行systemd,是否会使它变得更复杂或更容易处理?

答案1

发送的信号是可定制的,记录在man systemd.kill。最有趣的部分是:

       KillSignal=
           Specifies which signal to use when stopping a service. This
           controls the signal that is sent as first step of shutting down a
           unit (see above), and is usually followed by SIGKILL (see above
           and below). For a list of valid signals, see signal(7). Defaults
           to SIGTERM.

           Note that, right after sending the signal specified in this
           setting, systemd will always send SIGCONT, to ensure that even
           suspended tasks can be terminated cleanly.

       FinalKillSignal=
           Specifies which signal to send to remaining processes after a
           timeout if SendSIGKILL= is enabled. The signal configured here
           should be one that is not typically caught and processed by
           services (SIGTERM is not suitable). Developers can find it useful
           to use this to generate a coredump to troubleshoot why a service
           did not terminate upon receiving the initial SIGTERM signal. This
           can be achieved by configuring LimitCORE= and setting
           FinalKillSignal= to either SIGQUIT or SIGABRT. Defaults to
           SIGKILL.

因此,当您 时systemctl stop *.service,systemd 会SIGTERM默认向服务中的主进程发送一个。如果进程未在TimeoutStopSec(默认 90 秒)内退出,则将systemd跟进SIGKILL.

当您开发应用程序时,无需过多考虑 init 系统。如果您不想编写对 的响应SIGTERM,而只想保留SIGINT,则可以。您只需要确保您提供的任何 systemd 服务文件都包含该文件KillSignal=SIGINT

我没有读过任何建议在重新启动时systemd跳过的内容。KillSignal=如果您在关闭时看到“正在等待...”,则表明正在systemd等待事物响应KillSignal

答案2

据我所知,所有 init 系统都或多或少地实现相同的行为。也就是说,它们发送 SIGTERM 并等待一段时间,如果进程没有正常终止,它们会发送 SIGKILL。我相信 systemd 的工作方式是一样的。我可能是错的。确定的最好方法是测试它。

我建议您阅读各种信号的描述以及它们的含义,并使您的应用程序对它们做出相应的反应。

如果您的应用程序应该作为持久进程运行,您应该考虑为其创建一个 systemd 单元。这样,您将能够准确控制系统关闭时 systemd 应该做什么。

相关内容