麻烦用PHP shell_exec()去除终端会话

时间:2012-04-05 04:19:44

标签: php shell-exec nohup

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

2 个答案:

答案 0 :(得分:0)

shell_exec将一直等到你执行的命令返回(例如,回退到shell提示符)。如果你想将它作为后台任务运行,那么shelL_exec会立即返回,然后执行

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

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

答案 1 :(得分:0)

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

这是你真正想要的:

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

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

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

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

干杯