【问题标题】:PBS script -o file to multiple locationsPBS 脚本 -o 文件到多个位置
【发布时间】:2013-04-17 05:08:51
【问题描述】:

有时当我在 PBS 集群上运行作业时,我真的很喜欢两个地方的作业日志(-o 文件)。 $PBS_O_WORKDIR 中的一个用于将所有东西放在一起,一个${HOME}/jobOuts/ 用于 greping/awking/etc...

使用tee从命令行进行测试:

echo "hello" | qsub -o `tee $HOME/out1.o $HOME/out2.o $HOME/out3.o`

但是一旦我尝试将其放入我的 PBS 脚本中,如果我将其放入 PBS 脚本和 qsub 中,它就不起作用

####Parameterized PBS Script ####
#PBS -S /bin/bash
#PBS -l nodes=1
#PBS -l walltime=0:01:00
#PBS -j oe
#PBS -o `tee TEE_TEST.o TEE_TEST.${PBS_JOBID}.o`
#PBS -M me@email.com
#PBS -m abe
#PBS -V

cd $PBS_O_WORKDIR

echo `date`

这是 qsub 和错误:

qsub  TEST.pbs
qsub: directive error: -o `tee TEE_TEST.o TEE_TEST.${PBS_JOBID}.o`

我在下面尝试了其他一些方法 - 没有任何效果。

一个 -o 行(逗号、分号和空格):

#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o,${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o
#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o,${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o
#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o ${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o

还有两行:

#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o
#PBS -o ${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o

两个工作班轮只采用第二个 -o 选项,一个班轮不起作用。

有什么建议吗?是否可以?

【问题讨论】:

  • 仍然想知道...尝试了将tail -F /cm/local/apps/torque/var/spool/aux/${PBS_JOBID} >> ${HOME}/out2.o & 添加到我的脚本之类的方法,但没有得到任何结果。

标签: logging pbs supercomputers


【解决方案1】:

我很惊讶您的命令行示例有效。你的工作真的运行了吗?我的猜测是运行

echo "hello" | qsub -o `tee $HOME/out1.o $HOME/out2.o $HOME/out3.o`

使运行的工作短路,实际上只是抓住“你好”并将其传递给 tee。我的猜测是,更了解 bash 的人可以解释这里实际发生的事情。

我能想到的唯一方法是让你的脚本写东西来完成你的请求。为了使其工作,您需要将位置放在可从任何可能的计算节点访问的网络文件系统上。

【讨论】:

    【解决方案2】:

    我研究了qsub man page,我认为没有一种方法可以为标准输出和标准错误指定多个输出文件(每个)。从this page 中汲取灵感,这是我实现与您的目标相似的方法。您的 PBS 环境可能会有所不同。另外,我不是 bash 专家,所以可能有更简洁的方法来实现相同的目标。

    假设您使用默认的 -o 设置,请在常规作业脚本的末尾放置以下命令:

    # change to the directory from which this job was submitted
    cd $PBS_O_WORKDIR
    
    # the standard output by default will be in file JOBNAME.oJOBID
    # on my system, PBS_JOBID has ".machinename" at the end, which needs to be removed
    
    filename=${PBS_JOBNAME}.o${PBS_JOBID%%.*}
    
    echo "${PBS_O_WORKDIR}/copy.pbs $filename" | qsub
    

    这将使用标准输入参数启动 qsub,告诉它运行带有要复制的文件名参数的“copy.pbs”。我使用的copy.pbs文件是:

    #!/bin/bash
    
    # change to the directory from which this job was submitted
    cd $PBS_O_WORKDIR
    
    newfile=${HOME}/jobOuts/$1
    
    cp $1 $newfile
    

    这对我来说可以将第一个 PBS 标准输出复制到另一个目录。一个副作用是使用 qsub 运行 copy.pbs 会创建另外两个输出文件,STDIN.e* 和 STDIN.o*。我认为再次使用 qsub 是确保第一份工作完成的好主意。为了更安全,您可以在 qsub 中使用“取决于选项”,例如 "-W depend=afterok:$PBS_JOBID copy.pbs $filename" | qsub。但我没有测试这种方法,就像我说的,我不是这方面的专家。

    【讨论】:

    • 我还没有尝试过,但是是的,这是有道理的......看起来有点笨拙,但如果它有效,它就有效。也许甚至将-j oe 添加到qsubs 有助于避免.o .e 文件? -W depend=afterok 可能是最佳实践,因为许多集群不允许来自节点的 qsub。这让我想用qsub -l epilogue= dink ...
    • 杜赫关于抑制 .o .e!也对您的其他想法感兴趣。一旦我在非电话计算机上,我将编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    相关资源
    最近更新 更多