systemctl stop
和systemctl kill
有什么区别?
systemctl kill
支持向进程发送自定义信号,例如-9
(SIGKILL)而不是-15
(SIGTERM)。那么,systemctl kill
是systemctl stop
的一个更通用的版本,即systemctl stop
总是发送-15
(SIGTERM),这是唯一的区别吗?
例如,systemctl stop
和systemctl kill
对于ssh.service
(sshd
)具有相同的结果:
systemctl stop
:
$ systemctl stop sshd
$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2021-11-08 09:09:32 CET; 1s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 2086153 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Process: 2086154 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)
Main PID: 2086154 (code=exited, status=0/SUCCESS)
systemctl kill
:
$ systemctl kill sshd
$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2021-11-08 09:10:15 CET; 1s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 2086486 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Process: 2086487 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)
Main PID: 2086487 (code=exited, status=0/SUCCESS)
发布于 2021-11-08 14:52:23
systemctl kill
非常类似于kill
,因为它只发送一个信号(default=SIGTERM)。kill
和systemctl kill
的主要区别在于您可以指定一个单元而不是PID,而系统可以理解要向哪个进程发送信号。
另一方面,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
假设:
ExecStop=
KillSignal=
等于--signal=
。KillMode=
未设置,或等于process
。sshd.service的一个特别之处在于它包含了:
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
在这种情况下,您可能会问:这两个命令有什么不同:
# systemctl reload sshd
# systemctl kill --signal=SIGHUP --kill-who=sshd.service
虽然它们几乎是一样的,但区别在这里是很明显的.reload
在信号之前调用/usr/sbin/sshd -t
。
sshd.service的另一个特别之处在于它包含了KillMode=process
。这使得systemctl kill
和systemctl stop
更加接近,因为systemd不会清理孤立的子进程。默认情况下,KillMode=control-group
将导致systemd清理所有孤立的子进程。
https://unix.stackexchange.com/questions/676576
复制相似问题