QSUB:为作业阵列中的每个任务指定输出和错误文件

时间:2016-06-09 10:44:46

标签: bash cluster-computing qsub sungridengine

希望这不是一个公开的,也不仅仅是我们群集配置的问题......

我使用qsub使用以下命令将作业数组提交到群集:

qsub -q QUEUE -N JOBNAME -t 1:10 -e ${ERRFILE}_$SGE_TASK_ID /path/to/script.sh

其中

ERRFILE=/home/USER/somedir/errors.

我们的想法是指定一个错误文件(也类似于输出文件),该文件还包含作业数组中的任务ID。

到目前为止,我已经了解了这一行

#$ -e ${ERRFILE}_$SGE_TASK_ID
在script.sh中的

不起作用,因为它是一个注释而不是由bash评估。但是我的第一行不起作用,因为$SGE_TASK_ID仅在作业提交后设置 我阅读了here来逃避对$SGE_TASK_ID的评价(在该链接中,它是PBS'$PBS_JOBID,但类似的问题)应该有效,但是当我尝试时

qsub -q QUEUE -N JOBNAME -t 1:10 -e ${ERRFILE}_\$SGE_TASK_ID /path/to/script.sh

它没有按预期工作。

我错过了一些明显的东西吗?是否可以在错误文件的名称中使用$SGE_TASK_ID(错误文件的自动命名会这样做,但我想指定目录,如果可能的话也指定名称)?

其他一些评论:

  • 我在script.sh中使用-cwd qsub选项,但这不是我希望存储错误文件的地方。
  • 我接下来无法控制群集的工作方式,也没有root访问权限(在这种情况下我不知道我需要它,但无论如何......)。
  • 显然我们的群集不使用PBS。
  • 是的,我的脚本都是可执行的,并且在适用的情况下以#!/bin/bash开头(我还指定使用bash和qsub的-S /bin/bash选项。)
  • 似乎有一个解决方案here,但我不太确定它是如何工作的,它似乎也在使用PBS。如果那个答案适用于我的问题并且我误解了它,请告诉我。

我希望任何暗示正确的方向。 谢谢!

1 个答案:

答案 0 :(得分:6)

我也不知道这一点,但看起来Grid Engine有一些名为"伪环境变量"像$TASK_ID这样的目的。这应该有效:

qsub -q QUEUE -N JOBNAME -t 1:10 -e ${ERRFILE}_\$TASK_ID /path/to/script.sh

来自man page

 -e [[hostname]:]path,...
      ...

      If the  pathname  contains  certain  pseudo
      environment  variables, their value will be expanded at
      runtime of the job and will be used to  constitute  the
      standard  error  stream path name. The following pseudo
      environment variables are supported currently:

      $HOME       home directory on execution machine
      $USER       user ID of job owner
      $JOB_ID     current job ID
      $JOB_NAME   current job name (see -N option)
      $HOSTNAME   name of the execution host
      $TASK_ID    array job task index number