2013-12-11 60 views
5

我使用NSTask來執行,像這樣一系列的長時間運行命令:終止NSTask及其子

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]; 

這爲外殼創建一個進程,並取其命令在運行一個子進程時間(命令1或命令2)。如果我用[self.task terminate]殺死任務,它只會殺死父進程。有沒有辦法識別和殺死孩子呢?

+0

根據文檔終止發送SIGTERM到子任務。你確定你的子任務可以聽SIGTERM嗎? –

+0

不涉及shell的解決方案是爲每個進程創建一個NSTask。如果它們是被鏈接的,(a)你當前的代碼不會這樣做,(b)有兩個NSTasks,你可以從第一個的'terminateHandler'啓動第二個。 –

回答

4

這不完全優雅,但你可以使sh推出的子任務作爲後臺程序,然後使用shell變量$!here直到每個後臺進程完成,以保持寫它們的PID到一個文件,阻止異步:

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

然後,當您撥打[self.task terminate]時,您還應該調用:

system("kill -9 `cat /tmp/childpid`");
...或其他等效物。

+0

這會工作。這實際上並不像我以爲我必須要做的那樣可怕。謝謝! – stdout