Condor输出文件更新

Condor output file updating

本文关键字:更新 文件 输出 Condor      更新时间:2023-10-16

我正在使用Condor运行几个模拟,并对程序进行了编码,以便在控制台中输出进度状态。这是在循环结束时完成的,它只打印当前时间(也可以是百分比或经过的时间)。代码看起来像这样:

printf("START");while(程序需要Rum){//运行代码重复代码。。。//打印程序状态更新printf("[%i:%i:%i]\r\n",小时、分钟、秒);}printf("完成")

当正常执行时(即在终端/cmd/bash中),这很好,但condor节点似乎没有printf()状态。只有在模拟完成后,所有状态更新都会输出到文件中,但之后它就不再使用了。我提交给condor的*.子文件如下:

宇宙=香草可执行程序输出=输出-$(进程)error=out/err-$(进程)队列100

提交时,程序执行(在condor_q中确认),输出文件包含以下内容:

START

只有当程序完成运行后,其相应的输出文件才会显示(示例):

START[0:3:4][0:8:13][0:12:57][0:18:44]FINISH

程序执行时,输出文件仅包含START文本。因此,我得出的结论是,如果执行程序的节点繁忙,则不会更新文件。所以我的问题是,有没有一种方法可以手动更新输出文件,或者以更好的方式收集有关程序进度的任何信息?

已经感谢

最大

您想要做的是使用流输出选项。请参阅可以传递给condor_submitstream_errorstream_output选项,如下所示:http://research.cs.wisc.edu/htcondor/manual/current/condor_submit.html

默认情况下,HTCondor将stdout和stderr本地存储在execute节点上,并在作业完成时将它们传输回submit节点。将stream_output设置为TRUE将要求HTCondor在输出返回提交节点时对其进行流式传输。然后,您可以在发生时对其进行检查。

这是我几年前用来解决这个问题的东西。它使用condor_chirp,用于将文件从执行主机传输到提交者。我有一个python脚本,它执行我真正想要运行的程序,并将其输出重定向到一个文件。然后,我会定期将输出文件发送回提交主机。

这是Python包装器stream.py:

#!/usr/bin/python
import os,sys,time
os.environ['PATH'] += ':/bin:/usr/bin:/cygdrive/c/condor/bin'
# make sure the file exists
open(sys.argv[1], 'w').close()
pid = os.fork()
if pid == 0:
os.system('%s >%s' % (' '.join (sys.argv[2:]), sys.argv[1]))
else:
while True:
time.sleep(10)
os.system('condor_chirp put %s %s' % (sys.argv[1], sys.argv[1]))
try:
os.wait4(pid, os.WNOHANG)
except OSError:
break

还有我的提交脚本。问题运行了sh hello.sh,并将输出重定向到myout.txt:

universe                = vanilla
executable              = C:cygwinbinpython.exe
requirements            = Arch=="INTEL" && OpSys=="WINNT60" && HAS_CYGWIN==TRUE
should_transfer_files   = YES
transfer_input_files    = stream.py,hello.sh
arguments               = stream.py myout.txt sh hello.sh
transfer_executable     = false

它确实会完整地发送输出,所以如果同时运行了很多作业,请考虑到这一点。目前,它每10秒发送一次输出。。你可能需要调整一下。

使用condor_tail,您可以查看正在运行的进程的输出。要查看stdout,只需添加作业ID(如果您想跟随输出并立即查看更新,请添加-f。示例:

condor_tail 314.0 -f