Cocoa 终止NSTask及其子任务
我使用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
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`");