Процессы убийства открываются с помощью popen ()? - PullRequest
7 голосов
/ 19 января 2011

Я открываю длительный процесс с помощью popen ().Для отладки я бы хотел завершить процесс до его завершения.Вызов pclose () просто блокирует, пока дочерний процесс не завершится.

Как я могу завершить процесс?Я не вижу простого способа вытащить pid из ресурса, который возвращает popen (), чтобы я мог отправить ему сигнал.

Полагаю, я мог бы сделать что-то грязное и попытаться выдвинуть pid ввывод с использованием какой-то хакерской командной строки ...

Ответы [ 3 ]

8 голосов
/ 19 января 2011

Ну, приземлился на решение: я переключился обратно на proc_open() вместо popen(). Тогда это так просто, как:

$s = proc_get_status($p);
posix_kill($s['pid'], SIGKILL);
proc_close($p);
0 голосов
/ 24 июня 2011

Вы можете найти 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);
}

Он работает довольно хорошо на PHP-сервере fast-cgi.

0 голосов
/ 19 января 2011

Просто отправьте сигнал уничтожения (или прерывания), используя функцию уничтожения:

...