systemd 如何停止没有单元文件的服务

systemd 如何停止没有单元文件的服务

Systemd 可以继承孤立进程,并且还有其他方式可以在没有给定服务的单元文件的情况下运行服务。我想知道当发出重新启动或停止时没有任何服务定义的服务的全部内容是什么。

我对发送的信号和超时特别感兴趣,即 systemd 按照字典排序的服务名称的顺序向所有剩余的服务发送 sigterm,并在 30 秒后向任何剩余的服务发出 sigkill。 (我不知道这是否正确,但这是我感兴趣的信息类型)。

我也很想知道这是在哪里配置和记录的。

答案1

我快速浏览了源代码和手册页,我认为简单的答案是:

TimeoutStopSec= Configures the time to wait for stop. If a service is asked to stop, but does not terminate in the specified time, it will be terminated forcibly via SIGTERM, and after another timeout of equal duration with SIGKILL (see KillMode= in systemd.kill(5)). Takes a unit-less value in seconds, or a time span value such as "5min 20s". Pass "0" to disable the timeout logic. Defaults to DefaultTimeoutStopSec= from the manager configuration file (see systemd-system.conf(5)).

所以我查看 /etc/systemd/system.conf 并发现:

#DefaultTimeoutStopSec=90s

因此,当 systemd 重新启动目标发生时,systemd 会为其拥有的子进程获取一组 pid。查看源代码,systemd/src/core/killall.c 似乎表明:

static int killall(int sig, Set *pids, bool send_sighup) 

获取 systemd 的所有子进程的 pid 列表,并通过以下方式调用:

broadcast_signal(int sig, bool wait_for_exit, bool send_sighup)

这是在同一个文件中。所以我假设 pid 1 的任何子进程最终都会获得 SIGTERM 的默认信号,并且如果没有单元文件,可选的 SIGHUP 可能永远不会发送,它将等待配置的 DefaultTimeoutStopSec,然后发送 SIGKILL。

答案2

我编写了以下程序:

#! /bin/bash

trap "echo HUP > out.txt; exit 0" HUP
trap "echo INT > out.txt; exit 0" INT
trap "echo TERM > out.txt; exit 0" TERM

while true; do
    date
    sleep 1;
done

然后我将其作为后台进程运行:

./test.sh &

然后我重新启动。

下次启动时,“out.txt”处的信号为:

TERM

相关内容