如何清理僵尸进程

💡 原文中文,约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 命令查看哪些进程在使用设备,然后批量杀死这些进程。

➡️

继续阅读