Процессы убийства, открытые с помощью popen()?
Я открываю длительный процесс с помощью popen(). Для отладки я хотел бы завершить процесс до его завершения. Вызов pclose() просто блокирует, пока потомок не завершит.
Как я могу остановить процесс? Я не вижу простого способа извлечь pid из ресурса, который возвращает popen(), чтобы я мог отправить ему сигнал.
Полагаю, я мог бы сделать что-нибудь клуджевое и попытаться вставить pid в вывод, используя какой-нибудь хакерский способ командной строки...
3 answers
Что ж, я нашел решение: я снова переключился на proc_open()
вместо popen()
. Тогда это так же просто, как:
$s = proc_get_status($p);
posix_kill($s['pid'], SIGKILL);
proc_close($p);
Просто отправьте сигнал об уничтожении (или отмене), используя функцию уничтожения:
Вы можете найти pid и проверить, действительно ли вы его родитель, выполнив:
// Find child processes according to current pid
$res = trim(exec('ps -eo pid,ppid |grep "'.getmypid().'" |head -n2 |tail -n1'));
if (preg_match('~^(\d+)\s+(\d+)$~', $res, $pid) !== 0 && (int) $pid[2] === getmypid())
{
// I'm the parent PID, just send a KILL
posix_kill((int) $pid[1], 9);
}
Он довольно хорошо работает на быстром cgi PHP-сервере.