Condor输出文件更新

时间:2012-10-31 12:00:16

标签: c++ output condor

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

printf("START");
while (programNeedsToRum) {

   // Run code repetitive code...

   // Print program status update
   printf("[%i:%i:%i]\r\n", hours, minutes, seconds);
}
printf("FINISH");

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

universe = vanilla
executable = program
output = out/out-$(Process)
error = out/err-$(Process)
queue 100

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

START

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

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

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

非常感谢

最高

3 个答案:

答案 0 :(得分:2)

这是几年前我用来解决这个问题的东西。它使用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:\cygwin\bin\python.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秒发送一次输出..你可能想要调整它。

答案 1 :(得分:1)

使用condor_tail

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

condor_tail 314.0 -f

答案 2 :(得分:1)

您要做的是使用流输出选项。请参阅此处概述的stream_errorstream_output选项,您可以传递给condor_submithttp://research.cs.wisc.edu/htcondor/manual/current/condor_submit.html

默认情况下,HTCondor在执行节点上本地存储stdout和stderr,并在作业完成时将它们传回给提交节点。将stream_output设置为TRUE会要求HTCondor在输出返回提交节点时输出。然后你可以检查它。