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