2.7 进程
约 879 字大约 3 分钟
2025-05-06
2.7.1 垃圾进程
https://blog.csdn.net/qq_43619271/article/details/138166254
https://zhuanlan.zhihu.com/p/506686899
解决方法零
Kill Process 后依然占用显存并显示 No Such Process
查找僵尸进程:
ps aux | grep 'Z' # 僵尸进程(状态为 `Z` 或 `Zl`)
确认僵尸进程的父进程
ps -o ppid= -p <僵尸进程PID>
终止父进程:找到父进程后,终止它:
kill -9 <父进程PID>
解决方法一
使用
fuser
查找占用显卡资源的进程命令可以查看哪些进程正在使用 GPU 设备。命令如下:
fuser -v /dev/nvidia*
这会列出所有正在占用显卡资源的进程及其相关信息。
确认占用 GPU 的进程
查找进程信息:通过
fuser
找到进程号(PID)后,可以使用以下命令查看进程的详细信息:ps -ef | grep <PID>
这样可以确认是否是想要的程序
强制终止进程
如果确认进程是相关程序,强制终止进程:
kill -9 <PID>
解决方法二
所以如果知道 No Such Process 对应的 command 中有什么独特的字段的话,比如 No Such Process 原本的 command 中,有一段独有的字段 mixed
,那么就可以通过指令
ps aux | grep mixed | grep -v grep | awk '{print $2}' | xargs kill
借助这个 command,可以终止所有与“mixed”相关的进程
ps aux
:ps
命令用于列出当前系统上所有的进程。aux
是选项,表示:a
: 显示所有用户的进程,不仅仅是当前用户的进程(最好不加)u
: 以用户为中心显示进程x
: 显示没有控制终端的进程
grep mixed
:grep
是用来过滤文本内容的命令。这里它的作用是查找包含 "mixed" 字符串的进程信息
grep -v grep
:grep -v grep
这个部分是排除掉包含“grep”字符串的行。因为上一条命令中也会出现包含“grep mixed”的进程,这会导致我们匹配到自己当前执行的grep
命令,所以用-v
来排除掉这一行
awk '{print $2}'
:awk
是一个文本处理工具,'{print $2}'
表示输出每一行的第二列,这一列通常是进程的 PID
xargs kill
:xargs
会将从前面命令传递过来的 PID 列表作为参数传递给kill
命令kill
命令根据传入的 PID 来终止对应的进程
特殊:
查看僵尸进程的父进程 ID(PPID):
ps -o ppid= -p <僵尸进程PID>
- 如果 PPID 是
1
(init
或systemd
),说明父进程是系统级别的进程 - 如果 PPID 不存在,说明父进程已经退出
如果父进程是 init
或 systemd
,通常系统会自动回收这些僵尸进程。如果它们仍然存在,可以尝试以下方法:
重启系统:重启系统是最简单的方法,可以彻底清理所有僵尸进程
手动触发系统回收:如果不想重启系统,可以尝试重新启动
systemd
或init
:sudo systemctl daemon-reload
批量清理僵尸进程
如果有多个僵尸进程,可以编写一个简单的脚本来批量清理它们:
for pid in $(ps aux | grep 'Z' | awk '{print $2}'); do
ppid=$(ps -o ppid= -p $pid)
echo "Killing parent process $ppid of zombie process $pid"
kill -9 $ppid
done
这个脚本会找到所有僵尸进程并终止它们的父进程。(但是如果父进程是 1
就不行)