杀死一个不断重新启动的进程

杀死一个不断重新启动的进程

如果“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

如果知道进程的监听端口,可以使用fuserwith -kflag。

就像是,

fuser -k 3002/tcp

相关内容