通知python脚本进程已完成

时间:2015-02-19 16:24:53

标签: python subprocess

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

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

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

所以到目前为止我的逻辑是。打开同位素文件。获取所有数据。对于同位素[1]打开输入文件。将同位素[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文件中)。我的朋友使用ssh连接到服务器并运行模拟。模拟需要时间(大约60分钟),并且有很多模拟要做。因此,如果笔记本电脑关闭,连接将丢失并且该过程将被终止。我认为他可以使用nohup和&符号(nohup python3 script.py&)来运行脚本,这样即使在连接丢失之后该过程也会继续执行,但是并不是和& ?我的意思是,如果我使用nohup运行命令,我是否会将进程发送到后台,从而导致脚本出现故障?

1 个答案:

答案 0 :(得分:2)

问题是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  &