Cocoa 终止NSTask及其子任务

Cocoa 终止NSTask及其子任务,cocoa,nstask,Cocoa,Nstask,我使用NSTask执行一系列长时间运行的命令,如下所示: commandToRun = @"command 1;command2"; NSArray *arguments = [NSArray arrayWithObjects: @"-c", commandToRun, nil]; self.task = [[NSTask alloc] init]; [self.t

我使用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]
终止任务,它只会终止父进程。有没有办法识别并杀死这些孩子

这并不十分优雅,但您可以让
sh
将子任务作为后台进程启动,然后使用shell变量
$将它们的PID写入文件根据,阻塞直到每个后台进程完成,以保持异步性:

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

然后,当您调用
[self.task terminate]
时,您还应该调用:……或类似的东西。

根据文档,terminate将SIGTERM发送到子任务。您确定您的子任务可以侦听SIGTERM吗?不涉及shell的解决方案是为每个进程创建一个NSTask。如果要将它们链接起来,(a)您当前的代码不会这样做,(b)使用两个NSTASK,您可以从第一个NSTASK的
terminationHandler
启动第二个NSTASK。这样就行了。事实上,这并不像我想象的那么可怕,我认为我将不得不这么做。谢谢
system("kill -9 `cat /tmp/childpid`");