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)
答案1
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
假设:
- 没有
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 清理所有孤立的子进程
答案2
根据手册,kill
:
kill
PATTERN...
向一个或多个发送信号流程单位的。用于--kill-who=
选择要终止的进程。用于--signal=
选择要发送的信号。
和stop
:
stop
模式...
停止(停用)一个或多个单位在命令行上指定。
因此kill
将杀死特定单元的进程,同时stop
将停止指定单元。
您可以在这里看到差异:
# 没有进程被杀死 $ sudo systemctl 杀死 ufw $ sudo systemctl 状态 ufw ● ufw.service - 简单的防火墙 已加载:已加载(/lib/systemd/system/ufw.service;已启用;供应商预设:已启用) Active:活动(已退出)自 2021-11-08 星期一 05:47:44 -03 起; 18 秒前 文档:人:ufw(8) 进程:48409 ExecStart=/lib/ufw/ufw-init 启动安静(代码=已退出,状态=0/SUCCESS) 主PID:48409(代码=已退出,状态=0/成功) $ sudo ufw 状态 状态:活跃 哈斯塔行动 ----- ------ ----- 80 允许任何地方 ... $ sudo systemctl 重新启动 ufw $ sudo systemctl 停止 ufw $ sudo systemctl 状态 ufw ● ufw.service - 简单的防火墙 已加载:已加载(/lib/systemd/system/ufw.service;已启用;供应商预设:已启用) 活跃:不活跃(死亡)自 2021-11-08 星期一 05:49:08 -03 起; 1秒前 文档:人:ufw(8) 进程:48785 ExecStart=/lib/ufw/ufw-init 启动安静(代码=已退出,状态=0/SUCCESS) 进程:48995 ExecStop=/lib/ufw/ufw-init stop(代码=已退出,状态=0/成功) 主PID:48785(代码=已退出,状态=0/成功) $ sudo ufw 状态 状态:不活跃