使用或不使用 systemctl 终止 systemd 服务

使用或不使用 systemctl 终止 systemd 服务

像这样终止正在运行的守护进程 systemd 服务有什么区别:

kill -SIGKILL 3645

systemctl -s kill -SIGKILL 3645

其中 3645 是 systemd 服务的 pid。此外,使用第一种方法有什么缺点吗?

答案1

首先,你的systemctl语法是错误的:systemctl kill需要一个单元名称,而不是 PID,并且-s需要一个信号名称。正如所写的那样,它不会做任何事情,只会给你一个错误消息:

Failed to parse signal string kill.

如果你修复了这个问题,它会告诉你:

Failed to kill unit 3645.service: Unit 3645.service not loaded.

正确的语法是:

systemctl kill -s SIGWHATEVER whatever.service

显然,区别在于,您可以根据 systemd 单元(而不是 pid)向进程发送信号。由于一个单元可能运行多个进程,因此 systemd 可以将相同的信号发送到全部单元下运行的进程,实际上,这是默认设置。此--kill-who=选项允许您根据需要更改此设置。

不过,一般来说,养成向任何对象发送 SIGKILL 的习惯并不是一个好主意。您应该尽可能正常停止服务,例如使用systemctl stop whatever.service。SIGKILL 与您可能听说过并被警告过的潜在破坏性相同kill -9。而且,如果您通过任何一种方法终止服务,并且该服务配置为自动重新启动,它可能会这样做。这可能是也可能不是您想要的,具体取决于为什么您正在尝试发送终止信号。

相关内容