【问题标题】:Start and stop minecraft (java process) via php [closed]通过php启动和停止我的世界(java进程)[关闭]
【发布时间】:2012-11-12 19:34:49
【问题描述】:

好的,让我再试一次。 :-)

如果我尝试:

<?php
exec("java -Xms1024M -Xmx1024M -jar craftbukkit-1.4.2-R0.2.jar -o true");
?>

网页永远不会返回。我相信这是因为 CGI 正在等待进程完成,当然它永远不会这样做,因为它是一个服务器。

我在本地尝试这个,如果我在终端中输入相同的命令,它会按预期运行,所以我知道命令行没有问题。

所以……问题是:

1) exec 在进程完成之前会阻塞吗? 2)如果不是,这里发生了什么,如果是,我该如何改变这种行为?

================================================ ===============

所以这确实是一个笼统的问题,但我已经包含在特定环境中,这可能有助于解释我为什么要这样做。这一切都在 LINUX 上。

我想从 PHP 页面远程启动 Java 进程。诀窍当然是该进程将继续运行,并且我希望在该进程成功启动后完成 PHP 页面。

那么,首先我该怎么做?我已经尝试了很多我读过的东西,但无法让它们发挥作用。

第二部分有点棘手。停止 minecraft 服务器的方式是在终端中键入“停止”。当然,你可以在那里输入其他命令来做其他事情……它只是从标准输入读取。

如果我想停止它,或者发送其他命令,我需要从 PHP 脚本连接到标准输入并发送文本或其他内容。

当我启动 java 进程时,我是否将标准输入连接到一个文件,然后从未来的 PHP 脚本写入该文件?我不知道。

请给我一些关于正确方法的建议,然后我会尝试。如果它们有效,或者我有更详细的问题,我会告诉你。

谢谢!

【问题讨论】:

  • exec('java命令行');不要说“我尝试了一些东西”而没有给我们您尝试过的确切代码。
  • PHP 在其通常的部署模型中(每个请求一个 Apache 进程)可能是一个糟糕的语言选择。我会选择...其他任何东西,真的,只要它可以让您的 Web 服务器进程通过对 Minecraft 服务器子进程的引用保持运行。
  • 另外,这个问题有点太宽泛了。很明显,做你想做的事涉及几个步骤,你应该研究(然后提出问题)实施这些具体步骤。 (“如何从 PHP 启动子进程?”,“如何从 PHP 写入任意其他进程的标准输入?”。(或者关于在 PHP 中处理长时间运行的任务。)

标签: java php linux process minecraft


【解决方案1】:

在 php 中你可以使用函数 exec(); 即:

<?php
    if($method == "start"){
        exec("java -jar minecraft_server.jar");
    }else if($method == "stop"){
        exec("pkill java");
    }
?>

我不熟悉 Minecraft 的确切命令,但这就是它背后的理论。

编辑

你用过“screen”这个程序吗?

使用以下命令创建一个运行 Minecraft 服务器的新分离屏幕:

screen -dmS Minecraft /home/username/minecraft/launch.sh

这将创建一个名为 Minecraft 的新屏幕,并执行 launch.sh,这是我的世界服务器附带的脚本。这一切现在都将在后台运行,并且不会占用 shell。

要将命令发送到此运行屏幕,您可以使用:

screen -S Minecraft -X stuff $'stop\n'

发送停止命令。

【讨论】:

  • pkill 将杀死每个 java 进程,而不仅仅是 PHP 脚本启动的那个。
  • 应该很容易获得pid,尤其是如果您使用php启动该过程。
  • 如前所述,理论是使用 exec();我不熟悉所有 Minecraft 命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多