“systemctl stop”和“systemctl Kill”有什么区别?

Shu*_*eng 2 systemd

systemctl stop和 和有什么区别systemctl kill?

\n

systemctl kill支持向进程发送自定义信号,例如-9(SIGKILL)而不是-15(SIGTERM)。那么,唯一的区别是systemctl kill更通用的版本systemctl stop,即systemctl stop总是发送-15(SIGTERM)吗?

\n

作为示例,systemctl stop与( )systemctl kill的结果相同:ssh.servicesshd

\n

systemctl stop:

\n
$ systemctl stop sshd\n$ systemctl status sshd\n\xe2\x97\x8f ssh.service - OpenBSD Secure Shell server\n   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)\n   Active: inactive (dead) since Mon 2021-11-08 09:09:32 CET; 1s ago\n     Docs: man:sshd(8)\n           man:sshd_config(5)\n  Process: 2086153 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)\n  Process: 2086154 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)\n Main PID: 2086154 (code=exited, status=0/SUCCESS)\n
Run Code Online (Sandbox Code Playgroud)\n

systemctl kill:

\n
$ systemctl kill sshd\n$ systemctl status sshd\n\xe2\x97\x8f ssh.service - OpenBSD Secure Shell server\n   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)\n   Active: inactive (dead) since Mon 2021-11-08 09:10:15 CET; 1s ago\n     Docs: man:sshd(8)\n           man:sshd_config(5)\n  Process: 2086486 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)\n  Process: 2086487 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)\n Main PID: 2086487 (code=exited, status=0/SUCCESS)\n
Run Code Online (Sandbox Code Playgroud)\n

Ste*_*art 11

systemctl kill与它非常相似kill,它只是发送一个信号(默认=SIGTERM)。kill和 之间的主要区别systemctl kill是您可以指定一个单位而不是 PID,并且 systemd 理解您想要将该信号发送到哪些进程。

另一方面systemctl stop将停止命令行上指定的一个或多个单元。首先systemd将运行任何ExecStop=行(如果有)。如果仍有任何进程,请使用KillMode=规则处理这些进程。之后,它发送SIGTERM(可以用 更改KillSignal=)。如果SendSIGHUP=设置了,它会立即发送SIGHUP。如果进程不能很好地处理SIGTERM并且未能在90秒内停止(可以用 更改TimeoutStopSec=),则发送SIGKILL(可以用 更改FinalKillSignal=)。另外,如果KillMode=control-group(默认),那么任何子进程也将被杀死。

所以你可以看到这systemctl kill只是发送了一个信号。这可能会停止一个单元,但 systemd 并不能确保这种情况发生。相反,systemctl stop将停止一个单位。


systemctl kill相当于systemctl stop假设:

  1. 没有ExecStop=
  2. KillSignal=单元文件中等于--signal=.
  3. 该装置保证响应第一个信号(不挂起)并且不需要后续操作。
  4. KillMode=未设置,或等于process。

sshd.service 的特别之处在于它包含:

ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能会问:这两个命令有什么不同:

# systemctl reload sshd
# systemctl kill --signal=SIGHUP --kill-who=sshd.service
Run Code Online (Sandbox Code Playgroud)

虽然它们几乎相同,但这里的区别非常明显......在信号之前reload调用。/usr/sbin/sshd -t


sshd.service 的另一个特别之处是它包含KillMode=process. 这使得systemctl kill和systemctl stop更接近,因为孤立子进程不会被 systemd 清理。默认情况下KillMode=control-group会导致 systemd 清理所有孤立的子进程