“杀“并没有真正终止该进程,为什么?

“杀“并没有真正终止该进程,为什么?

我正在尝试提高我的命令行技能,但遇到了一个问题,我无法终止进程。我输入kill 22002200 是我的 PID,但进程没有被终止。几分钟后,等待仍然处于topand状态ps 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

答案1

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

kill -9 {PID}

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

man kill

答案2

如果kill调用时不带任何参数,则发送信号号 15 ( SIGTERM)。进程可以忽略此信号。此信号通知进程清理自己的内容,然后自行正确结束。这是个好方法。

您还可以“发送”进程无法忽略的信号编号 9 ( SIGKILL)。进程甚至不会识别它,因为是内核终止进程,而不是进程本身。這是邪路。

有人说kill -9 <pid>总是有效。这是错误信念。有些情况下甚至kill -9不会终止进程。例如,当进程处于状态D(不可中断睡眠)时。进程每次等待 I/O(通常不会太长)时都会进入此状态。因此,如果进程等待 I/O(例如在有缺陷的硬盘上)并且没有正确编程(超时),那么您只需无法终止进程。无论您做什么。您只能尝试使文件可访问,以便继续执行该过程。

答案3

尽管它的名字是 kill,但实际上它并不杀死进程,而是向进程发送信号。从手册页中可以看到:

kill - send a signal to a process

发送的默认信号kill [pid]信号终端这通常但不一定要求进程终止。编写一个程序,当你发送信号终端信号,但不推荐。

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

如果你真的想杀死一个程序,你需要使用终止信号通过做 来发出信号kill -9 [pid]

答案4

这是我用来在端口 80 上运行的本地主机(通过 angular cli)获取端口 80 上运行的应用程序信息

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

3348正在运行的进程的 pid 在哪里

相关内容