Завершить 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`");
... или что-то эквивалентное.