“ kill <PID>”没有真正杀死进程,为什么?


118

我正在尝试提高命令行技能,但是遇到了无法终止进程的问题。我键入kill 22002200是我的PID,并且不会终止该进程。几分钟后,等待仍然是在topps aux。我什至尝试用sudo键入-没有结果。

任何想法为什么会那样?


编辑

我发现了一个怪异的依赖关系,其中fg更新了进程列表:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

那是什么过程?您是否检查过该过程是否已终止?在这种情况下,您需要终止父进程。
htorque 2011年

该过程是top(如编辑中所列)。我只是想尝试将程序置于后台运行,然后再将其恢复。
Patryk'9

2
如果您使用CTRL-z暂停进程,则只要暂停该进程,它就会阻止大多数信号(即直到对进程执行fg或为止bg
2014年

Answers:


179

进程可以忽略某些信号。如果您发送SIGKILL,它将无法忽略它(也不会捕获它进行清理)。尝试:

kill -9 {PID}

通过阅读手册页了解更多信息:

man kill

22
还请注意,在某些非常特定的情况下,进程可能处于僵尸/已失效状态,即使SIGKILL也无法终止该进程。在这种情况下,您将必须找到父进程并杀死父进程。
Lie Ryan

15
如果该过程不合时宜,那就是KILL DASH NINE
斯科特,2011年

4
有时没有父进程,在这种情况下您就被搞砸了。删除此类过程的唯一方法是重新引导计算机。
user606723 2011年

2
kill命令的名称继续对许多用户(一开始包括我)产生误导。人们以为,当您说“杀死X”时,这意味着真的杀死X而不做其他事情。我知道这不会改变任何事情,但我希望他们选择一个更精致的名称……
rbaleksandar

1
什至在什至kill -9不起作用并且该过程仍然存在时该怎么办?
道格拉斯·加斯凯尔

42

如果kill在没有任何参数的情况下调用,它将发送信号号15(SIGTERM)。该信号可以被过程忽略。该信号通知清理自己的东西然后自己正确结束的过程。那是好方法。

您也可以“发送”信号编号9(SIGKILL),该信号编号不能被进程忽略。进程甚至无法识别它,因为内核结束了进程,而不是进程本身。那是邪恶的方式。

有人说kill -9 <pid>总是可行的。那是个误会。在某些情况下,甚至kill -9无法终止该进程。例如,当进程处于状态D(不间断睡眠)时。进程每次等待I / O时都会进入此状态(通常不很长)。因此,如果某个进程等待I / O(例如,在有缺陷的硬盘上),并且未正确编程(带有超时),那么您根本无法终止该进程。无论你做什么。您可以尝试使文件可访问,从而使过程继续进行。


2
这非常有帮助,由于挂在网络磁盘上的I / O访问而使我经历了几次,我想知道为什么我无法杀死冻结的进程。是否有关于此特定问题的更多文档以及如何解决?
Sheljohn 2014年

7

尽管它的名字是kill,但实际上并没有杀死进程,而是向它发送信号。从手册页:

kill - send a signal to a process

发送的默认信号kill [pid]SIGTERM,通常但不一定要求过程终止。当您向其发送SIGTERM信号时,很有可能编写一个播放乐曲的程序,但不建议这样做。

另一个常见的信号是SIGHUP,它通常用于要求程序重新读取其配置文件。

如果您真的想终止程序,则需要使用SIGKILL信号kill -9 [pid]


2

听起来您可能正在暂停一个进程(也许通过在终端中按Ctrl-Z)。在这种状态下,您的进程将不会响应,因为它已冻结。运行“ fg”将解冻该过程,因此它可以拾取信号并自行终止。这可以解释为什么“ fg”似乎会更新进程列表。


1
那么如何找到附属的终端呢?
ruX

0

在C ++中,我执行了:

kill(4024, SIGKILL);

在linux(Ubuntu)终端上,

$ ps -ax | grep my_su

输出为:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

看来(4024)仍然存在。但是,当我终止调用上面“ kill”语句的父进程时,4024不再出现。现在,我判断“已终止”过程不过是显示的一行而决定忽略它。我希望我的经验可以帮助某个人。干杯!


0

您还可以kill -l用来显示体系结构支持的信号,并了解有关可能希望用来正确发送信号的信号的更多信息。

注意:正如其他人可能提到的那样,kill -9 {PID}建议不要使用,除非使用僵尸程序。进程收到SIGKILL后,将立即关闭,而无需进行清洁或任何其他适当步骤。


0

这就是我过去在端口80上运行localhost的方法(通过angular cli)获取在端口80上运行的应用程序信息

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

3348运行过程的pid 在哪里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.