我正在使用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]
杀死任务,它只会杀死父进程。有没有办法识别和杀死孩子?
答案 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`");
......或类似的东西。