首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在linux C++中杀死僵尸进程,了解PID

在linux C++中杀死僵尸进程,了解PID
EN

Stack Overflow用户
提问于 2012-12-02 21:13:24
回答 5查看 10.5K关注 0票数 0

我必须在linux C中杀死/清除僵尸进程。我所知道的是僵尸进程的PID。

我在一个循环中创建了一些僵尸进程:

代码语言:javascript
复制
int i = 0;
for (i; i<5; i++)
{
  system("(: & exec sleep 30) &"); // create zombie for 30 sec
}

我可以使用以下命令获取它们的PID编号:

代码语言:javascript
复制
system("ps aux | awk '{ print $8 " " $2 }' | grep -w Z");

但是如何仅使用PID来杀死/清理它们呢?我将PID保存在一个可变的标准信号中:

代码语言:javascript
复制
kill(PID,9) 

甚至不起作用,因为进程已经死了。有没有其他方法可以做到这一点?请不要问我为什么我要创造僵尸来杀死他们。事实并非如此。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-15 05:01:08

这是我创建的用来杀死所有僵尸进程的脚本。它使用GDB调试器附加到父进程,并发送一个waitpid来杀死僵尸进程。这将使父母活着,并且只杀死僵尸。

将需要安装GDB调试器,并且您需要使用附加到进程的权限登录。已在Centos 6.3上测试通过

代码语言:javascript
复制
#!/bin/bash
##################################################################
# Script: Zombie Slayer
# Author: Mitch Milner
# Date:   03/13/2013 ---> A good day to slay zombies
#
# Requirements: yum install gdb
#               permissions to attach to the parent process
#
# This script works by using a debugger to
# attach to the parent process and then issuing
# a waitpid to the dead zombie. This will not kill
# the living parent process.
##################################################################

clear
# Wait for user input to proceed, give user a chance to cancel script
echo "***********************************************************"
echo -e "This script will terminate all zombie process."
echo -e "Press [ENTER] to continue or [CTRL] + C to cancel:"
echo "***********************************************************"
read cmd_string
echo -e "\n"

# initialize variables
intcount=0
lastparentid=0

# remove old gdb command file
rm -f /tmp/zombie_slayer.txt

# create the gdb command file
echo "***********************************************************"
echo "Creating command file..."
echo "***********************************************************"
ps -e -o ppid,pid,stat,command | grep Z | sort | while read LINE; do
  intcount=$((intcount+1))
  parentid=`echo $LINE | awk '{print $1}'`
  zombieid=`echo $LINE | awk '{print $2}'`
  verifyzombie=`echo $LINE | awk '{print $3}'`

  # make sure this is a zombie file and we are not getting a Z from
  # the command field of the ps -e -o ppid,pid,stat,command
  if [ "$verifyzombie" == "Z" ]
  then
    if [ "$parentid" != "$lastparentid" ]
    then
      if [ "$lastparentid" != "0" ]
      then
        echo "detach" >> /tmp/zombie_slayer.txt
      fi
    echo "attach $parentid" >> /tmp/zombie_slayer.txt
    fi
    echo "call waitpid ($zombieid,0,0)" >> /tmp/zombie_slayer.txt
    echo "Logging: Parent: $parentid  Zombie: $zombieid"
    lastparentid=$parentid
  fi
done
if [ "$lastparentid" != "0" ]
then
  echo "detach" >> /tmp/zombie_slayer.txt
fi

# Slay the zombies with gdb and the created command file
echo -e "\n\n"
echo "***********************************************************"
echo "Slaying zombie processes..."
echo "***********************************************************"
gdb -batch -x /tmp/zombie_slayer.txt
echo -e "\n\n"
echo "***********************************************************"
echo "Script complete."
echo "***********************************************************"

好好享受吧。

票数 3
EN

Stack Overflow用户

发布于 2012-12-02 21:18:14

“僵尸”是一个已经死亡的进程。你不能再杀它了。

“僵尸”实际上只是进程表中的一个条目,包含进程的退出状态。为了摆脱它,父进程必须调用wait()来检索该信息。或者,父进程可以退出自身;然后子进程成为所谓的“孤立进程”,并被ID为1的进程init采用。init会自动收获所有已死的子进程。

票数 3
EN

Stack Overflow用户

发布于 2012-12-02 21:19:11

你说得对你不能杀僵尸因为他们已经死了。

它们是僵尸的原因是因为进程已经完成,但父进程尚未获取退出代码。

最终,如果僵尸变成了孤儿,init应该会为你做这件事。真正的僵尸进程仍具有父进程,但该父进程尚未获取退出代码,它将一直持续到以下两种情况之一:

  • 父进程获取退出代码;或者
  • 在父进程退出时成为孤立进程。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13669597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档