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