我如何支持多个server.pid文件?

时间:2012-01-18 23:55:11

标签: linux playframework init.d

我在数据中心的多台计算机上运行游戏。我们把所有东西都归咎于地狱。在每个播放节点/ VM上,我使用Apache和init.d / play脚本来启动和停止播放服务。

问题是我们的游戏网站托管在共享网络存储上。这使部署非常好,您部署到一个地方,并在所有100台机器上更新网站。每台机器都有一个映射文件夹“/ z / www / PlayApp1”,其中播放应用程序存在。

问题是,当服务启动或停止时,server.pid文件将被写入应用程序文件所在的网络位置。

问题在于,当我调出100个节点时,第100个节点会用它的pid覆盖PID文件,现在pid文件只代表100个节点中的1个正确的进程ID。

那么如何在本地存储pid文件,而不是在网络共享上存储app文件?我需要每个服务器的PID文件来反映机器的实际过程。

我们正在使用CentOS(Linux)

提前致谢 约什

3 个答案:

答案 0 :(得分:2)

根据https://github.com/playframework/play/pull/43,看起来有一个--pid_file命令行选项;它可能只适用于应用程序根目录下的路径,因此您可能必须为每个不同的主机创建目录(可能是符号链接)

我对Play有0次经验,所以希望这是有用的信息。

答案 1 :(得分:1)

根据当前的源代码,我甚至认为它不应该运行第二个副本。 main函数是:

public static void main(String[] args) throws Exception {
    File root = new File(System.getProperty("application.path"));
    if (System.getProperty("precompiled", "false").equals("true")) {
        Play.usePrecompiled = true;
    }
    if (System.getProperty("writepid", "false").equals("true")) {
        writePID(root);
    }
    :
    blah blah blah
}

writePID是:

private static void writePID(File root) {
    String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
    File pidfile = new File(root, PID_FILE);
    if (pidfile.exists()) {
        throw new RuntimeException("The " + PID_FILE + " already exists. Is the server already running?");
    }
    IO.write(pid.getBytes(), pidfile);
}

意味着当您尝试使用相同的application.path运行多个副本时,它应该抛出异常。

所以要么你没有使用the version I'm looking at,要么你正在讨论 else。

在我看来,更改上面一行是一件简单的事情:

File root = new File(System.getProperty("application.path"));

为PID文件存储使用不同的属性,共享驱动器上的

虽然您需要小心,root也会传递给Play.int,因此您应该调查更改它的影响。

毕竟,这是开源软件的一大优势,因为你可以自己修复“错误”。


对于它的价值,我不是你选择部署的方法的忠实粉丝。是的,它简化了部署,但升级服务器是一个全有或全无的事情,如果你不小心安装了一些狡猾的软件,会让你感到悲伤。

很多更喜欢分阶段部署,因此我可以根据需要关闭不良节点。

答案 2 :(得分:0)

更改您的init脚本,将pid写入/ tmp或其他机器本地。 如果这很难,则符号链接可能会起作用。