我将执行以下命令来收割僵尸
/usr/bin/preap $(ps -ef | grep defunct | grep -v grep | awk '{ print $2 }' | xargs)
这种方法对服务有影响吗?
答案1
如果你在它的父级僵尸之前收割僵尸,你就会失去收割对父级僵尸的任何影响。这显然取决于应用程序。
没有什么理由主动去收割僵尸。有些操作系统不允许您这样做,除非手动跟踪父进程并使其执行waitpid
系统调用。 Solaris 提供了一个preap
实用程序,但您应该使用它的唯一情况是当程序行为异常并用僵尸进程填充进程表时。
答案2
您的脚本可能会过早地收获僵尸,从而阻止其父母收获它们,然后导致它们出现意外行为。
假设您无法解决这些僵尸进程存在的根本原因,我只会收获那些处于失效状态足够长的时间(例如 1 分钟)的进程,以避免绕过合法的收获:
for pid in $(ps -eo pid,s | nawk '$2 == "Z" {print $1 };sleep 60)
do
preap $pid
done
顺便说一句,| xargs
它在您的脚本中毫无用处,因为新行是有效的参数分隔符。