Завершить NSTask и его детей

Я использую 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];

Это создает процесс для оболочки и дочерний процесс для любой команды, выполняемой в данный момент (команда 1 или команда 2). Если я убью задачу с [self.task terminate] это только убивает родительский процесс. Есть ли способ идентифицировать и убить детей тоже?

1 ответ

Решение

Это не совсем элегантно, но вы можете сделать sh запустить подзадачи в качестве фоновых процессов, а затем записать их PID в файл с помощью переменной оболочки $! как здесь, блокировка до завершения каждого фонового процесса для поддержания асинхронности:

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

Затем, когда вы звоните [self.task terminate] Вы также должны вызвать:

system("kill -9 `cat /tmp/childpid`");
... или что-то эквивалентное.

Другие вопросы по тегам