运行 java 来自 python 的服务器并等待它启动
run java server from python and wait until it is up
所以我 运行 java 服务器从终端调用它:
java =Xmx12G - jar jar.jar --build ../foo --inMemory
然后服务器启动需要一些时间,有时需要一分钟,有时需要更多。
我想等到它了
我使用了 subprocess.call()
但是它没有终止,所以它永远等待。
我怎样才能等到有输出:
16:53:28.315 INFO (GrizzlyServer.java:153) Grizzly server running.
有两个问题:
1.) subprocess.call() 等待 java 服务器退出。
2.) 当父 (Python) 进程停止时,通常子进程会被杀死。
如果您仍然需要通过 Python 脚本实现它,您可以 运行 java 服务器在一个单独的进程组中,因此它与父进程分离(Python process) - 只适用于 *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 脚本并且脚本退出,子进程将被杀死(无论进程是否解耦)
所以我 运行 java 服务器从终端调用它:
java =Xmx12G - jar jar.jar --build ../foo --inMemory
然后服务器启动需要一些时间,有时需要一分钟,有时需要更多。
我想等到它了
我使用了 subprocess.call()
但是它没有终止,所以它永远等待。
我怎样才能等到有输出:
16:53:28.315 INFO (GrizzlyServer.java:153) Grizzly server running.
有两个问题:
1.) subprocess.call() 等待 java 服务器退出。
2.) 当父 (Python) 进程停止时,通常子进程会被杀死。
如果您仍然需要通过 Python 脚本实现它,您可以 运行 java 服务器在一个单独的进程组中,因此它与父进程分离(Python process) - 只适用于 *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 脚本并且脚本退出,子进程将被杀死(无论进程是否解耦)