首页 > 解决方案 > 如何在平台 LSF 的 bsub 数组作业参数中使用 LSB_JOBINDEX?

问题描述

我想将LSB_JOBINDEXto 作为参数传递给我的脚本,而不是使用环境变量。

这使我的脚本更加与 LSF 无关,并避免创建使用环境变量的帮助脚本。

但是,我无法LSB_JOBINDEX在参数中使用:它只能作为初始命令字符串的一部分。

例如,在 bash shell 中,我使用 test 命令:

bsub -J 'myjobname[1-4]' -o bsub%I.log \
  'echo $LSB_JOBINDEX' \
  '$LSB_JOBINDEX' \
  \$LSB_JOBINDEX \
  '$LSB_JOBINDEX' \
  "\$LSB_JOBINDEX"

say 的输出bsub2.log是:

2 $LSB_JOBINDEX $LSB_JOBINDEX $LSB_JOBINDEX $LSB_JOBINDEX

所以在这种情况下,只有第一个$LSB_JOBINDEX得到了扩展,但没有得到以下任何一个。

但我宁愿不将整个命令作为一个巨大的字符串传递,就像'echo $LSB_JOBINDEX'本例中的那样。我宁愿像在常规 bash 命令中那样使用单独的参数。

我也尝试过使用,%I但它仅适用于-o相关bsub选项,不适用于命令本身。

相关:在 LSF 作业数组中引用作业索引

在 LSF 10.1.0 中测试。相关文档:https ://www.ibm.com/support/knowledgecenter/en/SSWRJV_10.1.0/lsf_admin/job_array_cl_args.html

标签: lsf

解决方案


如果参数以$. 例如。如果 bsub 命令行是

bsub command -a $ARG1 -b $ARG2

然后 bsub 将为第二个和第四个参数的参数添加引号。命令是这样存储的

command -a '$ARG1' -b '$ARG2'

防止这种情况的一种方法是将命令放入脚本中。像这样:

$ cat cmd
echo $LSB_JOBINDEX
echo "line 2"
echo $LSB_JOBINDEX

然后像这样运行你的工作:

$ bsub -I < cmd
Job <2669> is submitted to default queue <normal>.
<<Waiting for dispatch ...>>
<<Starting on hostA>>
0
line 2
0

请注意,-I不需要。它只是为了让您可以在 bsub 的标准输出上看到作业输出。

编辑

好的。看起来这行得通。但这并不是一个真正的严肃答案,因为它太丑了。问题是如果参数以$. 所以策略是找到某种方法来确保参数中的第一个字符不是$. 一种方法是放置除参数的第一个字符以外的任何字符$。后跟一个退格文字,然后是$. 请注意,它必须是实际的退格字符,而不是^后跟H. 使用ctrl-v后跟 actrl-h来获取附加到命令行的文字。

$ bsub -I echo "x^H\$LSB_JOBINDEX" "x^H\$LSB_JOBINDEX"
Job <2686> is submitted to default queue <normal>.
<<Waiting for dispatch ...>>
<<Starting on hostA>>
0 0

编辑2

制表符文字也有效。并不是说它好多了。

$ bsub -I echo "       \$LSB_JOBINDEX" "       \$LSB_JOBINDEX"
Job <2687> is submitted to default queue <normal>.
<<Waiting for dispatch ...>>
<<Starting on hostA>>
0 0

推荐阅读