如何清理僵尸进程
💡
原文中文,约3500字,阅读约需9分钟。
📝
内容提要
僵尸进程是指子进程结束后未被父进程回收的状态。可以通过ps命令查看,清理方法包括杀死父进程或恢复父进程。此外,容器管理和进程状态检查也能解决此问题。
🎯
关键要点
- 僵尸进程是指子进程结束后未被父进程回收的状态。
- 父进程调用 fork() 创建子进程,子进程执行 exec() 加载新程序,结束后调用 exit()。
- 如果父进程没有调用 wait() 或 waitpid(),子进程会成为僵尸进程。
- 可以使用 ps 命令查看僵尸进程,命令为 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'。
- 僵尸进程本身无法被清理,只能通过杀死其父进程来清理。
- 可以使用 kill -9 <parent_pid> 杀死父进程,或批量清理所有僵尸进程的父进程。
- 发送 SIGCONT 信号可以恢复父进程,从而回收僵尸进程。
- 可以通过查找父进程所在的容器来清理僵尸进程。
- 查看进程状态和修复存储问题可以解决进程卡存储的情况。
- 查看进程堆栈和使用 fuser 命令可以解决进程卡在设备锁上的问题。
❓
延伸问答
什么是僵尸进程?
僵尸进程是指子进程结束后未被父进程回收的状态。
如何查看系统中的僵尸进程?
可以使用命令 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 来查看僵尸进程。
如何清理僵尸进程?
可以通过杀死父进程或发送 SIGCONT 信号恢复父进程来清理僵尸进程。
发送哪个信号可以恢复父进程?
可以发送 SIGCONT 信号(kill -18)来恢复父进程。
如何批量清理所有僵尸进程的父进程?
可以使用命令 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9 来批量清理。
如何处理进程卡在设备锁上的问题?
可以使用 fuser 命令查看哪些进程在使用设备,然后批量杀死这些进程。
➡️