Ответ 1
Я только что понял, как его решить: просто распечатайте команды оболочки с помощью эха и передайте результат в qsub:
echo "./script.sh var1=13 var2=24" | qsub
как я могу параметризовать оболочку script, которая выполняется на сетке (начата с qsub)? У меня есть оболочка script, где я использую getopts для чтения параметров.
Когда я запускаю (qsub script.sh -r firstparam -s secondparam..) этот рабочий script с qsub я получаю сообщения об ошибках,
qsub: недопустимый параметр - s
qsub: незаконное -r значение
поскольку qsub считает, что параметр для себя. Но я не нашел никакого решения.
Спасибо
Я только что понял, как его решить: просто распечатайте команды оболочки с помощью эха и передайте результат в qsub:
echo "./script.sh var1=13 var2=24" | qsub
Использование опции qsub -v является правильным способом:
qsub -v par_name=par_value[,par_name=par_value...] script.sh
par_name может использоваться как переменная в оболочке script.
В дополнение к ответу volk, чтобы ссылаться на переменные в списке (обозначенные -v), вы просто используете имя, которое вы определяете в своем вызове. Итак, скажите, что вы звонили в qsub следующим образом
qsub -v foo='qux' myRunScript.sh
Тогда myRunScript.sh
может выглядеть примерно так:
#!/bin/bash
#PBS -l nodes=1:ppn=16,walltime=0:00:59
#PBS -l mem=62000mb
#PBS -m abe
bar = ${foo}
echo ${bar}
Если выход будет
qux
Надеюсь, это поможет!
Я действительно удивлен, как долго этот вопрос прошел без хорошего ответа. Может быть, конкретная версия qsub
не указана. qsub
существует, по крайней мере, в Torque, а также в Sun Grid Engine, возможно, в других планировщиках. Поэтому важно знать, что вы используете. Я расскажу о нескольких здесь:
qsub -F <arguments> command
справочная страница
Вот пример того, как я обычно его использую. Начиная с этого примера script, который просто перекликается с любыми переданными ему аргументами:
$ cat testArgs.pbs
#!/usr/bin/env bash
echo [email protected]
Я бы выполнил задание следующим образом:
$ qsub -F "--here are the --args" testArgs.pbs
3883919.pnap-mgt1.cm.cluster
И вот как выглядит выходной файл после запуска:
$ cat testArgs.pbs.o3883919
--here are the --args
qsub command [ command_args ]
справочная страница
Вы просто добавляете аргументы после команды, так же, как и при выполнении в оболочке. У меня нет SGE, работающего в любом месте, поэтому нет примера для этого. Но это то же самое с Slurm, который ниже
sbatch command [ command_args ]
справочная страница
Здесь я отправляю те же script, которые я использовал с приведенным выше примером крутящего момента:
$ sbatch testArgs.sh what the heck
Submitted batch job 104331
И результаты:
$ cat slurm-104331.out
what the heck
Экспорт переменных среды очень отличается от передачи аргументов команде.
Вот хорошее обсуждение различий.
Ответы qsub
, прежде всего, рекомендуют -v
. Чтобы быть ясным, -v
экспортирует переменные среды, -F
передает аргументы команде.
Обычно я предпочитаю параметризовать мои скрипты, разрешая аргументы. На самом деле, я бы сказал, что гораздо шире использовать скрипты типа process_data.sh --threads 8
, чем делать что-то вроде export THREADS=8; process_data.sh
.