如何在Platform LSF中的bsub数组作业参数中使用LSB_JOBINDEX?

时间:2019-04-02 10:20:20

标签: lsf

我想将LSB_JOBINDEX传递给脚本的参数,而不要使用环境变量。

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

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

例如,从bash外壳中,我使用测试命令:

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

而说bsub2.log的输出是:

2 $LSB_JOBINDEX $LSB_JOBINDEX $LSB_JOBINDEX $LSB_JOBINDEX

因此,在这种情况下,只有第一个$LSB_JOBINDEX被扩展,而随后的任何扩展都没有。

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

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

相关:Referencing job index in LSF job array

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

1 个答案:

答案 0 :(得分:1)

如果参数以$开头,

bsub将在参数周围添加单引号。例如。如果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的stdout上看到作业输出。

编辑

好。看起来像这样。但这不是一个严肃的答案,因为它是如此丑陋。关键是,如果自变量以$开头,则bsub将用单引号引起来。因此,策略是找到某种方法来确保参数中的第一个字符不是$。一种方法是将$以外的任何字符作为参数的第一个字符。在其后跟一个退格字面量,后跟$。请注意,它必须是实际的退格字符,而不是^后跟H。使用ctrl-v后跟ctrl-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

EDIT2

标签文字也可以使用。并不是更好。

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