在Linux中,如何杀死一个进程?如果无法正常终止应如何操作? https://www.cnblogs.com/huangjiabobk/p/18093634
问题:在系统自带的 gui 进程管理器中,无法 kill 的某些进程时,需要的解决方案。
======================================
在Linux中,如何杀死一个进程?如果无法正常终止应如何操作?
问题一:有进程占用显卡内存,但是程序又没有运行起来,成为僵尸进程,就想把他kill掉,但是kill不掉
解决方式:
重启(也不一定能解决)
还是要kill掉
进程kill不掉的原因一般为,想kill的进程是子进程,父进程没kill的情况下,子进程就kill不了,那么我们需要kill他的父进程
eg. 当前想要kill的进程pid是 19757
尝试 kill 19757 和 kill -9 19757后
ps ux 仍能看到19757的进程,那么极有可能就是所谓的子进程了
解决方式:
cd /proc/19757
cat status
然后显示有 PPID = 1000
这就是19757的父进程了
kill -9 1000
再次
ps ux
会发现19757进程和1000进程都没了,显卡中的内存占用也没了
问题二:进程号显示相关异常,Ubuntu(Linux)GPU显存被占用但是找不到进程解决方法
nvidia-smi命令显示有进程占用显存,且显示进程号为 “10597”,无法kill,top,ps ux 也找不到这个进程
在确定这个虚假进程号“10597”归属自己的情况下
安装 psmisc(看下面的sudo就知道需要管理员权限)
sudo apt update
sudo apt install psmisc
然后使用fuser查看对应的进程
fuser -v /dev/nvidia*
接下来将显示的进程号 kill -9 PID 就行了
原文链接:https://blog.csdn.net/qq_37508554/article/details/121783698
3. 使用 pkill
命令
https://www.cnblogs.com/huangjiabobk/p/18093634
pkill
命令与 killall
类似,但它可以根据进程名、进程的有效用户ID等条件选择性地杀死进程:
pkill -TERM <process_pattern> # 发送SIGTERM信号
pkill -9 <process_pattern> # 发送SIGKILL信号,强制终止
对于僵死(zombie)进程
僵死进程实际上已经结束了,但由于其父进程尚未收集其退出状态,因此还会显示在进程列表中。僵死进程并不占用系统资源,除了在进程表中的一个条目。要解决僵死进程问题,通常不需要“杀死”它们,而是应当处理其父进程或者重新启动父进程以使其能够正确回收子进程。
强制终止顽固进程
对于某些异常顽固的进程,即使 SIGKILL
也不起作用的情况非常罕见,通常意味着内核或系统出现了严重问题。在这种情况下,可能需要考虑以下步骤:
- 检查进程是否进入了不可中断的系统调用状态,如果是,则可能需要使用
ptrace
工具或内核工具如fuser
、lsof
等来进一步诊断和解决问题。 - 如果是因为文件系统错误导致进程无法终止,尝试卸载相关文件系统或修复文件系统错误。
- 在极端情况下,可能需要重启相关的服务、守护进程,甚至整个系统。
注意事项
- 在大多数情况下,除非必要,否则尽量避免使用
SIGKILL
,因为它不给进程保存状态或释放资源的机会。 - 在生产环境中,应当尽可能了解进程行为并遵循正确的程序退出策略,以免数据丢失或系统不稳定。