【问题标题】:Condor output file updatingCondor 输出文件更新
【发布时间】:2012-10-20 21:09:22
【问题描述】:

我正在使用 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 文本。所以我得出的结论是,如果节点执行程序很忙,文件不会更新。所以我的问题是,有没有办法手动更新输出文件或以更好的方式收集有关程序进度的任何信息?

已经谢谢了

最大

【问题讨论】:

  • 您的执行节点是否使用共享文件系统,或者您是否将ShouldTransferFiles 设置为 TRUE?
  • 我遵循了我的大学指南,并指出对于他们的系统,should_transfer_files 始终设置为 TRUE,除非另有说明。我将使用该选项重新运行以确保。
  • 试用:当指定 should_transfer_fileswhen_to_transfer_output 值时,stringstream(通过 C++)创建的文件不能再被访问/创建。它没有用,即使我删除了整个 stringstream 并且只留下了控制台输出中的所有 condor 值,如你所说。

标签: c++ output condor


【解决方案1】:

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

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

【讨论】:

    【解决方案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 秒发送一次输出......您可能需要调整它。

    【讨论】:

      【解决方案3】:

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

      condor_tail 314.0 -f
      

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多