【问题标题】:run java server from python and wait until it is up从python运行java服务器并等待它启动
【发布时间】:2020-09-15 22:59:29
【问题描述】:

所以我从终端运行 java 服务器调用它:

java =Xmx12G - jar jar.jar --build ../foo --inMemory

然后服务器需要一些时间才能启动,有时需要一分钟。

我想等它起来。

我使用了subprocess.call(),但它并没有终止,所以它一直在等待。 我怎样才能等到有输出:

16:53:28.315 INFO (GrizzlyServer.java:153) Grizzly server running.

【问题讨论】:

  • 检查服务器是否有一些健康检查端点。现在许多框架都提供了这种开箱即用的 API。您也可以 ping 该服务器正在运行的端口并等待一些响应!= 不可用。
  • 也可以使用 jmx,但我想它很难做到

标签: java python subprocess grizzly


【解决方案1】:

有2个问题:

1.) subprocess.call() 一直等到 java 服务器退出。
2.) 当父(Python)进程停止时,子进程通常会被杀死。

如果您仍然需要通过 Python 脚本来创建它,您可以在单独的进程组中运行 java 服务器,这样它就与父进程(Python 进程)分离——它只适用于 *nix 操作系统:

import os
import time
import subprocess

p = subprocess.Popen(
    ['nohup', 'java', '=Xmx12G', '-jar', 'jar.jar', '--build', '../foo', '--inMemory']
    stdout=open('/tmp/logOut.log', 'w'),
    stderr=open('/tmp/logErr.log', 'w'),
    preexec_fn=os.setpgrp
)

while True:
    if 'Grizzly server running' in open('/tmp/logOut.log').read():
        break
    time.sleep(1)

注意:您需要通过管道进入文件并在 Python 中读取它们,如果您要通过管道进入 Python 脚本并且脚本退出,则子进程会被杀死(无论进程是否解耦)

【讨论】:

  • 看起来不错。这可以嵌入到一个例程中,即我运行服务器,等到它启动,然后在一个线性执行中调用这个服务器,对吧?
  • 可能,是的:)
猜你喜欢
  • 2012-05-25
  • 2012-07-24
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 2015-03-30
相关资源
最近更新 更多