我这里有一个python脚本,它从github下载一个jar文件,执行它,等待3分钟,并应该终止进程。
注意,这在windows上运行得很好,但不知怎么的,这个脚本并没有达到我在Ubuntu上需要的效果。jar文件确实完成了我需要它做的事情,但是在那之后,python脚本就不会继续了。
总之,p2 = subprocess.Popen(["java", "-jar", "serverstarter-2.0.1.jar", "&"], stdout=subprocess.DEVNULL)
运行后没有任何内容。甚至连time.sleep(180)
都没有。
因此,我试图弄清楚的是,为什么在脚本中执行jar文件似乎是"错误的";档位";脚本。
请注意,另一个python脚本以这种方式调用此脚本subprocess.run(["python3", p, "&"], stdout=subprocess.DEVNULL)
。
这是代码:
wget.download("https://github.com/AllTheMods/alltheservers/releases/download/2.0.1/serverstarter-2.0.1.jar", bar=None)
p1 = subprocess.run(["chmod", "+x", "serverstarter-2.0.1.jar"], stdout=subprocess.DEVNULL)
p2 = subprocess.Popen(["java", "-jar", "serverstarter-2.0.1.jar", "&"], stdout=subprocess.DEVNULL)
time.sleep(180)
p2.kill()
try:
log_files = glob(src + "**/*.log")
for files in map(str, log_files):
os.remove(files)
zip_files = glob(src + "**/*.zip")
for files in map(str, zip_files):
os.remove(files)
startserver_files = glob(src + "**/startserver.*")
for files in map(str, startserver_files):
os.remove(files)
serverstarter_files = glob(src + "**/serverstarter*.*")
for files in map(str, serverstarter_files):
os.remove(files)
files_to_move = glob(src + "**/*")
for files in map(str, files_to_move):
shutil.move(files, dest)
time.sleep(20)
forge_jar_file = glob(dest + "forge-*.jar")
for files in map(str, forge_jar_file):
print(files)
os.rename(files, "{}{}".format(dest, "atm6.jar"))
except Exception as e:
post_to_slack(f"Error occured in {os.path.basename(__file__)}! {e}")
quit()
如果您在Linux上,请在终端上键入:
ps -ef | grep -i java
并检查jar文件的进程ID,然后使用pkill命令杀死它。
从kill方法文档中引用:
https://pythontic.com/multiprocessing/process/kill
调用kill((时使用SIGKILL并终止进程。当使用SIGKILL时,进程不知道它已被发出>SIGKILL。进程无法进行任何清理。进程被终止立即请记住,尽管很小,但扼杀这个过程需要有限的时间。
并非所有进程都响应SIGKILL!!!!
建议终止命令中具有参数serverstarter-2.0.1.jar
的所有进程。
像这样:
pkill -9 -f "serverstarter-2.0.1.jar"
如果不能杀死ALL具有参数serverstarter-2.0.1.jar
的进程。您需要在创建时间后保存已创建进程的PID并终止它。