我正在尝试提高命令行技能,但是遇到了无法终止进程的问题。我键入kill 2200,其中2200是我的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


评论

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

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

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

#1 楼

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

kill -9 {PID}


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

man kill


评论


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

– Lie Ryan
2011年9月3日11:49



如果该过程不合时宜,那就是杀九点!

–斯科特
2011年9月5日下午4:22

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

–user606723
2011年9月6日15:25

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

–rbaleksandar
15年7月17日在14:08

即使在kill -9之后仍然不起作用,并且该过程仍然存在,该怎么办?

–道格拉斯·加斯凯(Douglas Gaskell)
18年8月8日在5:44

#2 楼

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

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

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

评论


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

–乔纳森·H
14年7月6日在20:13

#3 楼

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

kill - send a signal to a process

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

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

如果您真的想杀死程序,则需要通过执行kill -9 [pid]使用SIGKILL信号。

#4 楼

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

评论


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

–ruX
13年3月21日在16:58

#5 楼

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

#6 楼

在C ++中,我执行了:

kill(4024, SIGKILL);


在linux(Ubuntu)终端上,

$ ps -ax | grep my_su


输出为:

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


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

#7 楼

您还可以使用kill -l来显示体系结构支持的信号,并了解有关可能希望用来正确发送信号的信号的更多信息。除非它是僵尸程序,否则不建议使用kill -9 {PID}。进程收到SIGKILL后,将立即关闭,而无需进行清洁或任何其他适当步骤。