像这样终止正在运行的守护进程 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
。而且,如果您通过任何一种方法终止服务,并且该服务配置为自动重新启动,它可能会这样做。这可能是也可能不是您想要的,具体取决于为什么您正在尝试发送终止信号。