【问题标题】:how to kill parent and child process through shell?如何通过shell杀死父子进程?
【发布时间】:2012-04-22 18:08:29
【问题描述】:

我有一个由 shell 启动并由 shell 终止的应用程序。现在,在我的应用程序中,我创建了一个 fork 来减少应用程序的负载,因此目前两个进程以不同的 PID 以相同的名称运行。现在我想终止我的程序,如果我在 shell 中使用我的进程的 PID 杀死它只会杀死父进程,使其成为僵尸进程,而子进程仍然存在。那么如何通过shell杀死子进程和父进程呢?

【问题讨论】:

  • 我认为你可以使用负 PID....

标签: c++ linux shell fork parent-child


【解决方案1】:

查看命令killall

【讨论】:

  • 如果我可以在终端中使用 kill -9 processname 但我不能在 shell 或我的应用程序中使用,因为我的应用程序有一个子进程,该子进程有另一个子进程,所以我想在我的应用程序中杀死第二个孩子,并在 shell 中杀死第一个孩子,或者杀死父进程,如果可以像这种方式杀死的话
【解决方案2】:

ps -el你会得到以下

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 

get pid and ppid of your process do pkill -P <parent_pid_name> 意思是你的父进程 id 已经产生了子进程,然后是 kill <signal number> <pid> 在这种情况下,代替 pid 你必须给父进程产生了所有孩子的进程ID。

【讨论】:

    【解决方案3】:

    你的父进程应该在退出前捕获 SIGTERM 并杀死它的子进程。

    这是我用 C 写的

    int child;
    
    void sighandler(int sig) {
            if (sig == SIGTERM) {
                    if (child != -1) kill(child, SIGTERM);
            }
    }
    
    int main() {
            int i;
    
            child = -1;
            signal(SIGCHLD, SIG_IGN);
            signal(SIGTERM, sighandler);
    
            setsid();
            setpgid(0,0);
    
            i = fork();
            switch(i) {
            case -1:
                    break;
            case 0: // child
                    sleep (100);
                    break;
            default:
                    child = i;
                    sleep (100);
                    break;
            }
    
            return 0;
    }
    

    您可以使用“killall”命令杀死所有具有相同名称的进程。

    【讨论】:

      【解决方案4】:

      pkill 命令可以用来杀死进程。也杀了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        相关资源
        最近更新 更多