2012-04-10 13 views
1

私は、シェルによって開始され、シェルによって終了されるアプリケーションを持っています。私のアプリケーションでは、アプリケーションの負荷を軽減するためにforkを作成しました。現在、2つのプロセスが異なるPIDで同じ名前で実行されています。今私は自分のプログラムを終了したい。シェルのプロセスのPIDでkillすると、親プロセスを殺してゾンビプロセスとして残し、子プロセスは残る。だから、シェルを介して子プロセスと親プロセスの両方を殺す方法は?シェルで親プロセスと子プロセスを削除する方法は?

+0

私はあなたが負のPIDを使用することができます.... – pragati

答えて

2

コマンドkillallを参照してください。

+0

私はターミナルでkill -9 processnameを使用することができますが、私のアプリケーションは1つの子を持っているので、シェルまたは私のアプリケーションで使用することはできません子プロセスに別の子プロセスがあるので、私は自分のアプリケーションで2番目の子プロセスを終了し、シェルの最初の子プロセスをkillするか、親プロセスを終了します。 –

2

あなたはpkill -P <parent_pid_name>があなたpidの代わりに、この場合も、子供が生まれとkill <signal number> <pid>続いたあなたの親プロセスIDを意味しない、あなたのプロセスのpidppidを取得するには、次の

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

を取得しますps -elを行いますすべての子を産んだ親プロセスIDを与える必要があります。

1

あなたの父親のプロセスは、終了する前にSIGTERMを捕まえてその子を殺す必要があります。

私はあなたが「killallを」コマンドで同じ名前を持つすべてのプロセスを殺すことができる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; 
} 

でこれを書いています。

0

pkillコマンドを使用すると、プロセスを強制終了できます。またkillall

関連する問題