1

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

4

4 回答 4

2

见命令killall

于 2012-04-10T12:45:01.993 回答
2

ps -el会得到以下

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

getpidppidof 你的进程确实pkill -P <parent_pid_name>意味着你的父进程 id 已经产生了子进程,然后是kill <signal number> <pid>在这种情况下,pid你也必须提供已经产生所有子进程的父进程 id。

于 2012-04-10T12:56:00.847 回答
1

你的父进程应该在退出前捕获 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”命令杀死所有具有相同名称的进程。

于 2012-04-10T13:16:12.363 回答
0

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

于 2012-04-10T17:52:41.670 回答