1

我有用户提交了服务器运行的 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_terminate, proc_close, fcloses,但似乎无法杀死 javaw.exe 进程。会exec("kill -9 ".$procStatus['pid'])杀成功吗?我在 Windows 上进行测试,但服务器在 unix 上。

4

1 回答 1

3

执行 exec("kill -9 ".$procStatus['pid']) 肯定会杀死该进程。您可以先尝试不带“-9”参数的 kill 以允许更好的杀戮,然后 maxbe 再次检查进程是否仍然存在,“-9”参数是强制杀戮。

在 Windows(至少版本 7)下,您可以使用 exec("taskkill /PID".$procStatus['pid']) 进行测试,它应该做的完全一样。

于 2012-08-20T16:14:49.413 回答