如何通过shell杀死父进程?

问题描述:

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

+0

我认为你可以使用一个负PID .... – pragati 2012-04-10 13:51:20

查看命令killall

+0

如果我能够在终端使用kill -9 processname但我不能在shell或在我的应用程序中使用,因为我的应用程序我有一个孩子进程该子进程有另一个子进程,所以我想杀死我的应用程序中的第二个子进程,并杀死第一个子进程,或者杀死父进程,如果有可能像这样杀死 – 2012-04-10 13:14:06

ps -el你会得到以下

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

得到pid和你的过程ppidpkill -P <parent_pid_name>这意味着你的父进程ID已经催生了儿童和随后kill <signal number> <pid>在这种情况下,也代替pid你必须给出产生所有孩子的父进程ID。

您的父进程应该在退出之前捕获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”命令。

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