2012-04-10 5 views
1

Ich habe eine Anwendung, die von der Shell initiiert und von der Shell beendet wird. Jetzt hatte ich in meiner Anwendung eine Verzweigung erstellt, um die Auslastung meiner Anwendung zu reduzieren, sodass momentan zwei Prozesse unter demselben Namen mit unterschiedlichen PIDs ausgeführt werden. Jetzt möchte ich mein Programm beenden, und wenn ich mit der PID meines Prozesses in der Shell töte, tötet es nur den Elternprozess und lässt es als Zombieprozess zurück und der Kindprozess bleibt. So, wie man Kinder- und Elternprozesse durch die Schale tötet?Wie Eltern und Kind Prozess durch Shell zu töten?

+0

Ich denke, Sie können eine negative PID verwenden .... – pragati

Antwort

2

Siehe den Befehl killall.

+0

wenn ich kann Kill -9 Prozessname in Terminal verwenden, aber ich kann nicht in der Shell oder in meiner Anwendung verwenden, weil meine Anwendung ich ein Kind habe Verarbeite diesen Kindprozess mit einem anderen Kindprozess, also möchte ich das zweite Kind in meiner Anwendung töten und das erste Kind in der Shell töten oder den Elternprozess beenden, wenn es möglich ist, auf diese Weise zu töten –

2

tun ps -el Sie erhalten die folgende

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

pid und ppid Ihres Prozesses erhalten tun pkill -P <parent_pid_name> Ihre Eltern-Prozess-ID bedeutet, die Sie Kinder und gefolgt von kill <signal number> <pid> Auch in diesem Fall, anstelle von pid hervorgebracht hat muss die Elternprozess-ID angeben, die alle Kinder hervorgebracht hat.

1

Ihr Vater-Prozess sollte SIGTERM abfangen und sein Kind vor dem Beenden töten.

Ich schrieb dies in 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; 
} 

Sie alle Prozesse mit dem „killall“ Befehl mit dem gleichen Namen töten.

0

pkill-Befehl, den Sie verwenden können, um den Prozess zu beenden. Auch killall