【问题标题】:Submit SGE job array with random file names提交随机文件名的 SGE 作业数组
【发布时间】:2019-02-18 09:51:55
【问题描述】:

我有一个脚本,它为每个子分析启动了大约 200 个工作。我意识到由于几个原因,工作数组可能会更好。这似乎很简单,但对我来说不太有效。我的输入文件没有编号,所以我按照我见过的示例先执行此操作:

INFILE=`sed -n ${SGE_TASK_ID}p <pathto/listOfFiles.txt`

我的 qsub 命令接受了很多变量,因为它同时拉取和输出到不同的目录。 $res 没有改变,但是 $INFILE 是我正在循环的内容。

qsub -q test.q -t 1-200 -V -sync y -wd ${res} -b y perl -I /master/lib/ myanalysis.pl -c ${res}/${INFILE}/configFile-${INFILE}.txt -o ${res}/${INFILE}/

由于这不起作用,我很好奇到底传递了什么。所以我对此做了一个回应,发现它似乎只扩展到第一次使用 $INFILE 时。所以我得到:

perl -I /master/lib/ myanalysis.pl -c mydirectory/fileABC/

代替:

perl -I /master/lib/ myanalysis.pl -c mydirectory/fileABC/configFile-fileABC.txt -o mydirectory/fileABC/

希望对此有所澄清,并欢迎所有建议。提前致谢!

更新:集群上似乎没有设置 $SGE_TASK_ID。我寻找任何可用于数组 ID 的变量,但找不到任何东西。如果我看到任何其他内容,我会再次更新。

【问题讨论】:

  • 尝试echo $INFILE 以查看您的sed 命令是否有效。我会使用INFILE=$(grep "${SGE_TASK_ID}" pathto/listOfFiles.txt)
  • 你是如何循环访问$INFILE的? sn-p 似乎表明您只是在使用整个变量。也许你的意思是for file in $INFILE; do qsub ... ; done
  • 顺便说一下,不要对 shell 变量使用 ALL_CAPS 名称。这些是为系统和外壳保留的。
  • 嗨@MarkSetchell,我确实做了回声。我的 sed 命令和您建议的 grep 命令都提供相同的结果。由于某种原因,它仍然只扩展至第一次使用 $INFILE。
  • 嗨@rici,我试图避免提交多个单独的工作。这就是为什么我试图了解如何最好地提交作业数组。最初我提交它们的方式与您建议的使用 for 循环差不多。

标签: bash cluster-computing job-scheduling sungridengine


【解决方案1】:

假设您使用的是网格引擎变体,则应在作业中设置 SGE_TASK_ID。看起来您希望在使用 qsub 之前将其设置为一些有用的变量。提交这样的脚本将大致完成您似乎想要做的事情: #!/bin/bash INFILE=$(sed -n ${SGE_TASK_ID}p <pathto/listOfFiles.txt) exec perl -I /master/lib/ myanalysis.pl -c ${res}/${INFILE}/configFile-${INFILE}.txt -o ${res}/${INFILE}/

然后用

提交这个脚本
res=${res} qsub -q test.q -t 1-200 -V -sync y -wd ${res} myscript.sh

`

【讨论】:

  • 谢谢威廉。是的,我误解了 SGE_TASK_ID 变量的设置方式/时间。实际上,我在插入一堆 echo 语句以查看发生了什么之后发现了这一点。最终,我完全按照您在上面发布的内容进行了操作。非常感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多