4

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

printf("开始");
而(programNeedsToRum){

   // 运行代码重复代码...

   // 打印程序状态更新
   printf("[%i:%i:%i]\r\n", 小时, 分钟, 秒);
}
printf("完成");

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

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

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

开始

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

开始
[0:3:4]
[0:8:13]
[0:12:57]
[0:18:44]
结束

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

已经谢谢了

最大限度

4

3 回答 3

3

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

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

于 2014-12-25T03:14:22.167 回答
2

这是我几年前用来解决这个问题的东西。它使用condor_chirpwhich 用于将文件从执行主机传输到提交者。我有一个 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 秒发送一次输出......您可能需要调整它。

于 2012-10-31T15:06:54.510 回答
1

condor_tail您可以查看正在运行的进程的输出。要查看标准输出,只需添加作业 ID(如果您想关注输出并立即查看更新,则添加 -f。例如:

condor_tail 314.0 -f
于 2014-11-25T13:54:04.017 回答