使用和不使用 systemctl 杀死 systemd 服务

Gor*_*don 6 kill kill-process systemd systemctl

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

kill -SIGKILL 3645

systemctl -s kill -SIGKILL 3645

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

Mic*_*ton 22

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

Failed to parse signal string kill.
Run Code Online (Sandbox Code Playgroud)

如果你解决了这个问题,它会告诉你:

Failed to kill unit 3645.service: Unit 3645.service not loaded.
Run Code Online (Sandbox Code Playgroud)

正确的语法是:

systemctl kill -s SIGWHATEVER whatever.service
Run Code Online (Sandbox Code Playgroud)

显然,区别在于您可以根据 systemd 单元而不是 pid 向进程发送信号。因为一个单元可能运行多个进程,所以 systemd 可以向该单元下运行的所有进程发送相同的信号,事实上,这是默认的。该--kill-who=选项可让您在必要时更改此设置。

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

  • @戈登嗯?“不惜一切代价”和“安全”是相互排斥的。你到底是什么意思? (2认同)