Процессы убийства, открытые с помощью popen()?


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

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

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

Author: Frank Farmer, 2011-01-19

3 answers

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

$s = proc_get_status($p);
posix_kill($s['pid'], SIGKILL);
proc_close($p);
 7
Author: Frank Farmer, 2011-01-19 04:19:46

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

 0
Author: Elalfer, 2011-01-19 04:14:19

Вы можете найти 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-сервере.

 0
Author: Yvan, 2011-06-24 13:05:42