首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >‘`systemctl’和‘`systemctl’之间有什么区别?

‘`systemctl’和‘`systemctl’之间有什么区别?
EN

Unix & Linux用户
提问于 2021-11-08 08:19:09
回答 1查看 14.2K关注 0票数 2

systemctl stopsystemctl kill有什么区别?

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

例如,systemctl stopsystemctl kill对于ssh.service (sshd)具有相同的结果:

systemctl stop

代码语言:javascript
运行
复制
$ 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

代码语言:javascript
运行
复制
$ 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)
EN

回答 1

Unix & Linux用户

发布于 2021-11-08 14:52:23

systemctl kill非常类似于kill,因为它只发送一个信号(default=SIGTERM)。killsystemctl 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假设:

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

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

代码语言:javascript
运行
复制
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID

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

代码语言:javascript
运行
复制
# 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清理所有孤立的子进程。

票数 9
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/676576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档