使用popen()打开杀戮进程?

时间:2011-01-19 04:06:55

标签: php linux kill popen

我正在用popen()打开一个长时间运行的进程。对于调试,我想在完成之前终止该过程。调用pclose()只会阻塞,直到孩子完成。

我该如何杀死这个过程?我没有看到任何简单的方法来从popen()返回的资源中获取pid,以便我可以向它发送信号。

我想我可以做一些kludgey并尝试使用某种命令行hackery将pid捏到输出中......

3 个答案:

答案 0 :(得分:8)

好了,找到了一个解决方案:我切换回proc_open()而不是popen()。然后就这么简单:

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

答案 1 :(得分:0)

使用kill function发送kill(或abort)信号:

答案 2 :(得分:0)

您可以找到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服务器上运行良好。

相关问题