1

我维护一个游戏服务器,不守规矩的玩家经常让应用程序崩溃。我的审核团队需要能够重新启动服务器进程,但允许 ssh 访问将是不切实际/不安全的,因此我使用 shell exec 传递所需的命令以从基于 Web 的界面重新启动服务器进程。问题是,shell 会话没有正确分离,因此 php 保持其会话,直到它最终超时并关闭会话/停止服务器进程。这是我调用 shell_exec 的方式: $command='nohup java -jar foobar_server.jar'; shell_exec($command);

4

2 回答 2

0

shell_exec 将等到您执行的命令返回(例如返回到shell 提示符)。如果您想将其作为后台任务运行,那么 shellL_exec 立即返回,然后执行

$command='nohup java -jar foobar_server.jar &'; 
                                            ^--- run in background

当然,这假设您在 unix/linux 主机上执行此操作。对于 Windows,它会有所不同。

于 2012-04-05T04:28:16.867 回答
0

如果你尝试这个,你会发现它不起作用。要在 PHP 中完全分离,您还必须进行标准输出重定向,否则即使使用 '&',shell_exec 也会挂起。

这是你真正想要的:

shell_exec('java -jar foobar_server.jar >/dev/null 2>&1 &');

但为了更进一步,我将摆脱 Web 界面,并将其设为一分钟间隔的 cronjob,它首先检查进程是否正在运行,以及它是否没有启动新实例:

#!/bin/bash
if ! pidof foobar_server.jar; then
    java -jar foobar_server.jar >/tmp/foobar_server.log 2>&1 &;
fi

并且让它每分钟运行一次,如果它找到一个正在运行的进程,它什么也不做,否则它会启动一个新实例。服务器崩溃后的最坏情况是停机 59 秒。

干杯

于 2012-04-05T08:33:31.117 回答