我使用popen()打开了一个长时间运行的进程。为了调试,我想在它完成之前终止进程。但是调用pclose()会一直阻塞直到子进程完成。
如何杀死这个进程?我没有找到简单的方法来获取popen()返回资源中的pid,以便可以向其发送信号。
我想我可以尝试使用某种命令行技巧将pid蒙混到输出中...
我使用popen()打开了一个长时间运行的进程。为了调试,我想在它完成之前终止进程。但是调用pclose()会一直阻塞直到子进程完成。
如何杀死这个进程?我没有找到简单的方法来获取popen()返回资源中的pid,以便可以向其发送信号。
我想我可以尝试使用某种命令行技巧将pid蒙混到输出中...
好的,找到了解决方案:我改回使用 proc_open()
而不是 popen()
。然后就很简单了:
$s = proc_get_status($p);
posix_kill($s['pid'], SIGKILL);
proc_close($p);
proc_open()
时的同样问题,所以我尝试了更简单的popen()
,希望这会有所帮助。当时我没有意识到,同时 pclose()
和proc_close()
都会阻塞直到子进程终止。一旦你意识到这一点,那么你就必须杀死子进程。而要杀死子进程,你需要pid,而这在popen()
中并不容易获得。proc_open()
可以完成popen()
的所有功能,还有更多的功能。 - Frank Farmer// 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服务器上运行得非常好。
只需使用kill函数发送一个kill(或abort)信号即可:
posix_kill()
。我想回过头来看,我本可以从ps中grep子进程列表,因为很容易找到自己的pid。 - Frank Farmer