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

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

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

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

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

 $s = proc_get_status($p); posix_kill($s['pid'], SIGKILL); proc_close($p); 

Просто отправьте сигнал kill (или прервите) с помощью функции kill:

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