终止NSTask及其子项

时间:2013-12-11 14:30:35

标签: cocoa 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];

这将为shell创建一个进程,并为当时正在运行的命令(命令1或命令2)创建子进程。如果我用[self.task terminate]杀死任务,它只会杀死父进程。有没有办法识别和杀死孩子?

1 个答案:

答案 0 :(得分:4)

它不是很优雅,但你可以让sh将子任务作为后台进程启动,然后根据here使用shell变量$!将其PID写入文件,阻塞直到每个后台进程都完成以保持异步性:

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

然后当你致电[self.task terminate]时,你也应该调用:

system("kill -9 `cat /tmp/childpid`");
......或类似的东西。