如何优雅地杀死一个有名字的守护进程?

Eon*_*nil 17 process kill

我通常用killall.

killall markdoc
Run Code Online (Sandbox Code Playgroud)

但我不确定这个命令是否优雅地终止了进程。此命令是否实现了正常终止?如果没有,我怎样才能优雅地终止一个带有它的名字的进程?

enz*_*tib 20

你的问题不是很清楚,你在标题中讲了一个守护进程,而在正文中只讲了一个通用进程。

对于守护进程,有特定的方法可以停止它,例如在 Debian 中你有

    service daemon-name stop
Run Code Online (Sandbox Code Playgroud)

或者

    /etc/init.d/daemon-name stop
Run Code Online (Sandbox Code Playgroud)

其他发行版/操作系统中使用的其他 initscript 标准也存在类似的语法。

要杀死一个非守护进程,假设它在某种方式失控,您可以安全地使用killallor pkill,因为它们默认使用SIGTERM(15) 信号,并且任何编写得体的应用程序都应该在收到此信号时捕获并优雅地退出. 考虑到这些实用程序可能会杀死多个进程,如果有许多同名进程。

如果这不起作用,您可以尝试SIGINT(2),然后SIGHUP(1),以及作为最后的手段SIGKILL(9)。应用程序无法捕获最后一个信号,因此它无法执行任何清理。出于这个原因,每次都应该避免它。

二者pkillkillall接受形式的信号参数-NAME,如在

pkill -INT process-name
Run Code Online (Sandbox Code Playgroud)