我有一个不会死的烦人的进程:
ps -A | grep "nzbget"
给我:
11394 pts/3 00:00:00 nzbget
如果我尝试:
pkill nzbget (or 11394)
...我没有得到任何回应,该过程仍然存在,顶部给了我:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11394 asystem+ 20 0 125448 6244 4984 T 0.0 0.1 0:00.00 nzbget
我用“nzbget -s”运行 nzbget,如果我在它运行后执行此操作(并且我试图阻止它),我会收到 [绑定套接字失败] 错误,我所能做的就是重新启动。
我怎样才能在不重新启动的情况下杀死它?
答案1
当进程停止*(请注意T
中的状态输出top
)时,它根本无法执行任何信号处理。因此,您需要使用不需要进程交互的信号,在您的情况SIGKILL
(9) 中,如下所示
kill -9 11394
如果您出于某种原因想要获取进程的核心转储(并且您的系统已为此进行配置),则可以改用SIGSEGV
(11)。这也不需要任何进程交互。
* 我假设在这里停止,因为跟踪的进程应该能够处理信号,这可能导致进程被停止。
答案2
您可以使用kill -9 11394
不优雅地完全终止进程,这将调用以下命令:
从Linux/UNIX 命令行上 3 个最重要的“kill”信号:
内核将释放该进程而不通知该进程。像这样不干净的杀戮可能会导致数据丢失。这是可用的“最难”、“最粗暴”和最不安全的杀戮信号,只能用于阻止似乎无法阻止的事情。
答案3
您可以尝试多种信号,我相信其他人会列出这些信号,但我发现最有效的信号是HUP
:
kill -hup 11394
我发现这在很多应用程序不响应任何其他信号的情况下都有效。如果失败,您可以这样做kill -9
,尽管这可能会产生副作用,因为它只是拔掉插头并且不会让应用程序清理。
答案4
对于 X 应用程序,我很幸运地使用 xkill 并在应用程序无法响应命令行的终止时单击其窗口