通知 python 脚本进程已完成

Notify a python script that a process is done

首先我只想说这是我第一次使用python而且我对并行计算一无所知所以我的问题可能有点傻。

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

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

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

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

我期望 subprocess.call 的行为方式与它对类似 subprocess.call("C:\Windows\System32.calc.exe") 的行为相同(开始计算并在那里停止,直到计算关闭)。我的意思是我预计 tripoli 会开始 运行ning 并且 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    -s NJOY -c /home/nefeli/.tripoli48/Exec/Env/t4path.ceav5 -o   -p  -t bsd  &
\rm -f *.update graphe graphe.port last_simulation*

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

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

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