gpt4 book ai didi

python - 通知 python 脚本进程已完成

转载 作者:行者123 更新时间:2023-12-01 04:50:25 28 4
gpt4 key购买 nike

首先我要说的是,这是我第一次使用Python,而且我对并行计算一无所知,所以我的问题可能有点愚蠢。

一位 friend 在 CentOS 5.5 上运行的集群上运行了一些模拟。对于每次运行,程序 (tripoli) 将 3 个文件作为输入。第一个文件包含要处理的数据,第二个文件是输出文件(将结果存储在此文件中),第三个文件是指示如何在集群上分配工作负载的文件( graphe.save )。

从一次运行到另一次运行,唯一改变的是输入文件中的特定行。即第 14.176 行。我将该行的所有可能值存储在另一个文件中。我将其称为同位素文件。

所以到目前为止我的逻辑是。打开同位素文件。获取所有数据。对于同位素[1],打开输入文件。将 isotopes[1] 写入 inputfile[14175]。关闭输入文件。运行该输入文件的程序。完成后,重复同位素[2]。每次运行大约需要 50 到 60 分钟。

我想通过轮询 qhost 命令来查看节点负载何时低于阈值(例如 0.5%),以便确定计算是否完成,但这似乎是不好的做法。

我期望 subprocess.call 的行为与类似这样的事情相同 subprocess.call("C:\Windows\System32.calc.exe")(启动 calc 并在那里停止直到计算关闭)。我的意思是,我预计 tripoli 将开始运行,并且 python 将停止到该点,直到 tripoli 到达计算结束。但事实并非如此。一旦我点击运行,tripoli 就会启动与数据文件中的行数一样多的实例。

我在这里缺少什么?

我到目前为止的代码

import os
import os.path
import re
import datetime
import subprocess

def getLinesfromFile(filetobeOp, mode):
with open (filetobeOp, mode) as temp:
data = temp.readlines()
temp.close()
return data


isotope = getLinesfromFile('isotopes','r')

for i, element in enumerate(isotope):
runs+=1
data = getLinesfromFile('inputfile','r')
data[14175]="\t"+element
tempElement = element.replace("\n", "")
commandRunTripoli = "./run.sh inputfile "+tempElement.rsplit(' ', 1)[0]+".out graphe.save"

with open('tmt','w') as f2:
f2.writelines(data)
f2.close()

subprocess.call(commandRunTripoli)

print(datetime.datetime.now())
print("Tripoli run #", runs, "with isotope::", element)

run.sh 文件包含以下内容

#!/bin/sh                                                                                                                                                                                                                        
#export LD_LIBRARY_PATH=/usr/local/TRIPOLI-4.8/CODE/lib/linux-intel- 4:$LD_LIBRARY_PATH

\rm -f *.update graphe graphe.port last_simulation*
mpirun /home/nefeli/.tripoli48/Exec/bin/linux-intel-64/static_tripoli4 -d $1 -s NJOY -c /home/nefeli/.tripoli48/Exec/Env/t4path.ceav5 -o $2 -p $3 -t bsd &
\rm -f *.update graphe graphe.port last_simulation*

正如 kjp 所指出的,问题是我正在将进程发送到后台(& 在 .sh 文件中)。我的 friend 使用 ssh 连接到服务器并运行模拟。模拟需要时间(大约 60 分钟),并且需要进行大量模拟。因此,如果笔记本电脑关闭,连接就会丢失,进程也会被终止。我认为他可以使用 nohup 和 & 符号( nohup python3 script.py & )运行脚本,这样即使在连接丢失后进程也会继续执行,但是 nohup 不和 & 做同样的事情吗?我的意思是,如果我使用 nohup 运行命令,我是否会将进程发送到后台,从而导致脚本出现故障?

最佳答案

问题是 shell 将 mpirun 置于后台并立即返回,如果您想等到 mpirun 完成运行,请删除末尾的 & 。

mpirun  /home/nefeli/.tripoli48/Exec/bin/linux-intel-64/static_tripoli4 -d   $1 -s NJOY -c /home/nefeli/.tripoli48/Exec/Env/t4path.ceav5 -o  $2 -p $3 -t bsd  &

关于python - 通知 python 脚本进程已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28611517/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com