Вопрос

I'm using NSTask to execute a series of long running commands like so:

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

This creates a process for the shell, and a child process for whichever command is running at the time (command 1 or command 2). If I kill the task with [self.task terminate] it only kills the parent process. Is there a way to identify and kill the children too?

Это было полезно?

Решение

It's not exactly elegant, but you can make sh launch the subtasks as background processes and then write their PIDs to a file using the shell variable $! as per here, blocking till each background process completes to maintain asynchronicity:

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

Then when you call [self.task terminate] you should also invoke:

system("kill -9 `cat /tmp/childpid`");
...or something equivalent.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top