QSUB:为作业数组中的每个任务指定输出和错误文件
QSUB: Specify output and error files for each task in Job Array
希望这不是重复的,也不仅仅是我们集群配置的问题...
我正在使用 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
的评估(因为 link 它是 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 中使用
qsub
的 -cwd
选项,但这不是我希望存储错误文件的地方。
- 我几乎无法控制集群的工作方式,也没有 root 访问权限(不知道在这种情况下我需要它做什么,但无论如何...)。
- 显然我们的集群不使用 PBS。
- 是的,我的脚本都是可执行的,并且在适用的情况下以
#!/bin/bash
开头(我还指定使用 bash 和 qsub 的 -S /bin/bash
选项)。
- 似乎有一个解决方案 here,但我不太确定它是如何工作的,它似乎也在使用 PBS。如果该答案确实适用于我的问题而我误解了它,请告诉我。
对于正确方向的任何提示,我将不胜感激。
谢谢!
我也不知道这个,但看起来 Grid Engine 有一些叫做 "pseudo environment variables" 的东西,比如 $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
希望这不是重复的,也不仅仅是我们集群配置的问题...
我正在使用 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
的评估(因为 link 它是 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 中使用
qsub
的-cwd
选项,但这不是我希望存储错误文件的地方。 - 我几乎无法控制集群的工作方式,也没有 root 访问权限(不知道在这种情况下我需要它做什么,但无论如何...)。
- 显然我们的集群不使用 PBS。
- 是的,我的脚本都是可执行的,并且在适用的情况下以
#!/bin/bash
开头(我还指定使用 bash 和 qsub 的-S /bin/bash
选项)。 - 似乎有一个解决方案 here,但我不太确定它是如何工作的,它似乎也在使用 PBS。如果该答案确实适用于我的问题而我误解了它,请告诉我。
对于正确方向的任何提示,我将不胜感激。 谢谢!
我也不知道这个,但看起来 Grid Engine 有一些叫做 "pseudo environment variables" 的东西,比如 $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