2013-12-11 17 views
5

używam NSTask wykonać szereg długich poleceń biegania tak:wypowiedzieć NSTask i jego dzieci

commandToRun = @"command 1;command2"; 
NSArray *arguments = [NSArray arrayWithObjects: 
         @"-c", 
         commandToRun, 
         nil]; 
self.task = [[NSTask alloc] init]; 
[self.task setLaunchPath: @"/bin/sh"]; 
[self.task setArguments: arguments]; 
[self.task launch]; 

Stwarza to proces powłoki, a proces potomny za cokolwiek polecenie porusza się czas (polecenie 1 lub polecenie 2). Jeśli zabiję zadanie z [self.task terminate], zabije tylko proces nadrzędny. Czy istnieje sposób identyfikacji i zabijania dzieci?

+0

Zgodnie z dokumentacją zakończyć wysyłanie SIGTERM do podzadań. Jesteś pewien, że twoje podzadania mogą nasłuchiwać SIGTERM? –

+0

Rozwiązaniem, które nie wymaga powłoki, byłoby utworzenie NSTask dla każdego procesu. Jeśli mają być powiązane, (a) twój aktualny kod tego nie zrobi i (b) z dwoma NSTaskami, możesz uruchomić drugi z 'terminationHandler' pierwszego. –

Odpowiedz

4

To nie do końca elegancki, ale można zrobić sh uruchomić podzadań jako procesów w tle, a następnie napisać swoje PID do pliku za pomocą zmiennej powłoki $! zgodnie here, blokując aż każdy proces w tle dopełnia do utrzymania asynchroniczność:

commandToRun = @"command1 & echo $! > /tmp/childpid; wait $!; command2 & echo $! > /tmp/childpid; wait $!"; 

Następnie, gdy zadzwonisz pod numer [self.task terminate], powinieneś również wywołać:

system("kill -9 `cat /tmp/childpid`");
... lub coś podobnego.

+0

To zadziała. To nie jest tak przerażające jak ja, co myślałem, że będę musiał zrobić. Dzięki! – stdout