Как использовать LSB_JOBINDEX в аргументах задания массива bsub в LSF платформы? - PullRequest
1 голос

Я бы хотел передать 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, но не для самой команды.

Похожие: Ссылка на индекс задания в массиве заданий LSF

Проверено в LSF 10.1.0. Сопутствующая документация: https://www.ibm.com/support/knowledgecenter/en/SSWRJV_10.1.0/lsf_admin/job_array_cl_args.html

1 Ответ

1 голос
/ 03 апреля 2019

bsub будет добавлять одинарные кавычки вокруг аргументов, если аргумент начинается с $.Например.Если командной строкой bsub является

bsub command -a $ARG1 -b $ARG2

, то bsub добавит к аргументам кавычки для 2-го и 4-го параметров.Команда хранится так:

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.

EDIT

OK.Похоже, это работает.Но это не очень серьезный ответ, так как это так некрасиво.Дело в том, что 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
...