如果“kill -9”不起作用怎么办?或者如何终止启动新进程的脚本?无论如何对我没有帮助。
我有一个 python 脚本使用另一个进程 ID 自动启动使用相同的端口当被杀时使用sudo kill -9 <pid>
。
$ lsof -i :3002
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 13242 ubuntu 3u IPv4 64592 0t0 TCP localhost:3002 (LISTEN)
$ sudo kill -9 13242
$ lsof -i :3002
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 16106 ubuntu 3u IPv4 74792 0t0 TCP localhost:3002 (LISTEN)
$ sudo kill 16106
$ lsof -i :3002
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 16294 ubuntu 3u IPv4 75677 0t0 TCP localhost:3002 (LISTEN)
这不是僵尸进程。
$ ps -Al
4 S 0 16289 1 0 80 0 - 12901 poll_s ? 00:00:00 sudo
4 S 1000 16293 16289 0 80 0 - 1100 wait ? 00:00:00 sh
0 S 1000 16294 16293 0 80 0 - 34632 poll_s ? 00:00:00 python
我什至尝试过但sudo pkill -f <processname>
没有运气。它不想死。
更新:
它的父进程是上表中提到的sh
父进程。sudo
我不确定突然杀死它们是否安全。这也是一个共享的 ubuntu 服务器。
答案1
自动启动另一个进程ID意味着这是一个不同的过程。因此,有一个父进程监视其子进程,如果其中一个进程死亡,它会被父进程重生。如果您想完全停止服务,请了解如何停止父进程。使用杀死它SIGKILL
当然是选项之一,但可能不是 The Right One TM,因为服务监视器可能需要进行一些清理才能正确关闭。
要找到监视器进程,您可能需要检查整个进程列表,因为实际的侦听器可能会使其与其父进程分离(通常通过组合fork() + setsid()
)。在这种情况下,我发现ps faux
(至少,可能因其他实现而异)的输出procps
相当方便 - 它列出了分层树中的所有进程。除非已经有一个PID包(也可以看看维基百科),监视器 PID 应小于任何侦听器的 PID(当然除非您遇到 PID 环绕)。
答案2
如果知道进程的监听端口,可以使用fuser
with -k
flag。
就像是,
fuser -k 3002/tcp