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

我正在数据中心的多台机器上运行。 我们平衡了一切。 在每个播放节点/虚拟机上,我正在使用Apache和一个init.d / play脚本来启动和停止播放服务。

问题是我们的游戏网站托pipe在共享networking存储上。 这使得部署真的很好,你部署到一个地方,网站在所有100台机器上更新。 每台机器都有一个映射文件夹“/ z / www / PlayApp1”,该应用程序所在的位置。

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

问题是,当我popup100个节点时,第100个节点将覆盖带有PID的PID文件,而现在pid文件仅代表100个节点中的1个的正确进程ID。

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

我们正在使用CentOS(Linux)

在此先感谢乔希

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

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

根据当前的源代码,我甚至不认为它应该运行第二个副本。 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运行多个副本时,它应该会引发异常。

所以要么你不使用我正在看的版本,或者你正在讨论别的东西。

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

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

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

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

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


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

喜欢分阶段部署,所以我可以根据需要关闭不良节点。

改变你的init脚本,把pid写到/ tmp或者别的机器本地。 如果这很难,符号链接可能会起作用。