强制从PHP中杀掉失控的java exec

时间:2012-08-20 15:53:05

标签: java php timeout

我有用户提交的服务器运行的java文件。由于存在无限循环的可能性,我在PHP中运行超时倒计时。问题是,proc_get_status似乎在javaw.exe实际完成之前更新(因为它永远不会有无限循环);在第一次迭代之后procStatus["running"] == false

$javaCmd = "javaw -cp \"$home/$target_dir\" $fl  2>&1 < ". $fileIn;
$proc = proc_open('exec '.$javaCmd, array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w")), $pipes);

$procStatus = proc_get_status($proc);

if($procStatus["pid"] === false)
{
    echo 'PRocess is not running... something is wrong';
}
else
{
    if($procStatus["running"] == true)
    {
        $timeOut = 0;
        while($timeOut < $timeLimit)
        {
            echo 'timeout...'.$timeOut.' while timelimit is '.$timeLimit.'<br/>';
            sleep(1);
            $timeOut = $timeOut +1;
            if( $procStatus["running"] == false) 
            {
                echo 'broke before timeout...<br/>';
                break;  // Exited before the timeout.   
            }
            $procStatus = proc_get_status($proc);
        }
        var_dump($procStatus);  
    }
    echo 'killing process<br/>';

    var_dump(proc_terminate($proc));
}

我曾尝试在$ proc和$ pipes上执行proc_terminateproc_closefcloses,但似乎没有任何工作可以杀死javaw.exe进程。 exec("kill -9 ".$procStatus['pid'])会成功杀死吗?我在Windows上测试,但服务器在unix上。

1 个答案:

答案 0 :(得分:3)

执行exec(“kill -9”。$ procStatus ['pid'])肯定会杀死该进程。 你可以先尝试杀死没有'-9'参数,以便更好地杀死然后 如果进程仍然存在,则再次检查maxbe,' - 9'参数是强制kill。

在Windows下(至少版本7)你可以使用exec(“taskkill / PID”。$ procStatus ['pid']) 对于测试,它应该完全相同。