我正在使用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
文本。所以我得出结论,如果执行程序的节点忙,文件不会更新。所以我的问题是,有没有办法手动更新输出文件或以更好的方式收集有关程序进度的任何信息?
非常感谢
最高
答案 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_error
和stream_output
选项,您可以传递给condor_submit
:http://research.cs.wisc.edu/htcondor/manual/current/condor_submit.html
默认情况下,HTCondor在执行节点上本地存储stdout和stderr,并在作业完成时将它们传回给提交节点。将stream_output
设置为TRUE
会要求HTCondor在输出返回提交节点时输出。然后你可以检查它。