2012-04-10 140 views
1

我有一個由shell啓動並由shell終止的應用程序。現在在我的應用程序中,我創建了一個fork來減少我的應用程序的負載,所以目前有兩個進程使用不同的PID運行在相同的名稱上。現在我想終止我的程序,並且如果我在shell中使用我的進程的PID殺死它,它只會殺死父進程,使其成爲殭屍進程,並且子進程仍然存在。那麼如何通過shell殺死子進程和父進程呢?如何通過shell殺死父進程?

+0

我認爲你可以使用一個負PID .... – pragati 2012-04-10 13:51:20

回答

2

查看命令killall

+0

如果我能夠在終端使用kill -9 processname但我不能在shell或在我的應用程序中使用,因爲我的應用程序我有一個孩子進程該子進程有另一個子進程,所以我想殺死我的應用程序中的第二個子進程,並殺死第一個子進程,或者殺死父進程,如果有可能像這樣殺死 – 2012-04-10 13:14:06

2

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。

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」命令。

0

pkill命令可以用來殺死進程。也killall