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

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

systemctl stop和 和有什么区别systemctl kill

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

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

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假设:

  1. 没有ExecStop=
  2. KillSignal=单元文件中等于--signal=.
  3. 该装置保证响应第一个信号(不挂起)并且不需要后续操作。
  4. 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 killsystemctl stop更接近,因为孤立子进程不会被 systemd 清理。默认情况下KillMode=control-group会导致 systemd 清理所有孤立的子进程

答案2

根据手册,kill

killPATTERN...
向一个或多个发送信号流程单位的。用于--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 状态
状态:不活跃

相关内容