Question

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?

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top