如图,多次在kill -9 此进程后依然存在

先说解决办法,输入过滤命令ps -ef|grep xxx(此处写要过滤的进程名字),例如

之后kill掉对应的进程号,如图

问题解决。

如果有多个子进程可以先过滤再一起杀死:ps -ef | awk '/spark/ && !/awk/{print $2}' | xargs kill -9

这里我思考了一下发生问题的原因,kill掉3575没有提示进程不存在,3565应该是父进程,而子进程在被杀死之后因为依赖的父进程存活,又立马重新运行,所以即便多次成功杀死3575子进程依然存活。

简单讲就是进程已经成为僵死进程,当它的父进程将它回收或将它的父进程kill掉即可在ps输出看不到了

僵尸进程不能被杀死,因为它们已经死亡,只等待它们的父进程回收它们。

而如果杀死不存在进程会有提示信息,这也说明之前的僵尸进程是被杀死又重新运行了的:

当然进程杀不死也有其他可能:

1.因为jps这个命令是jdk提供的,准确率不高,而ps -ef是linux自带的,前者查询不准确导致的。

2.进程正处在内核状态中,Linux进程运行时分内核和用户两种状态,当进程进入内核状态后,会屏蔽所有信号,包括SIGKILL,所以这个时候kill -9也变得无效了。

当SIGKILL被发送给一个程序时,它使程序立即终止。与SIGTERM和SIGINT相比,这个信号不能被捕获或忽略,同时接收这个信号的进程在收到这个信号时不能执行任何清理。

即使SIGKILL被发送给它,一个正在不可中断睡眠的进程也可能不会终止(并且释放它的资源)。这是少数几个一个UNIX系统可能需要被重新启动来解决临时软件问题的例子中的一个。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐