параметр для сценариев оболочки, которые запускаются с помощью qsub

как я могу параметризовать сценарий оболочки, который выполняется в сетке (начинается с qsub)? У меня есть сценарий оболочки, в котором я использую getopts для чтения параметров.

Когда я запускаю (qsub script.sh -r firstparam -s secondparam ..) этот рабочий скрипт с qsub, я получаю сообщения об ошибках,

qsub: недопустимая опция -- s

qsub: недопустимое значение -r

поскольку qsub думает, что параметр для себя. Но я не нашел никакого решения.

Спасибо


person Martin    schedule 17.08.2010    source источник
comment
Я только что понял, как это решить: просто вывести команды скрипта оболочки с эхом и передать результат в qsub: ./script.sh | qsub   -  person Martin    schedule 17.08.2010
comment
Вы должны опубликовать свое решение в качестве ответа. Затем вернитесь и отметьте его принятым. Кстати, вы пробовали процитировать аргумент qsub? qsub 'script.sh -r firstparam -s secondparam' Не знаю, работает ли это в данном случае.   -  person Dennis Williamson    schedule 17.08.2010
comment
Я видел более одной команды с именем qsub; вы имеете в виду этот?   -  person Keith Thompson    schedule 16.01.2012


Ответы (4)


Использование параметра qsub -v является правильным способом:

qsub -v par_name=par_value[,par_name=par_value...] script.sh

par_name может использоваться как переменная в сценарии оболочки.

person volks    schedule 19.01.2011
comment
Спасибо за ваше предложение! На мой взгляд, проблема с этим подходом заключается в различии обработки параметров для использования одного приложения в качестве автономного или распределенного приложения. Поэтому я предпочитаю стиль, описанный выше. - person Martin; 21.01.2011
comment
Что, если меня не интересуют имена переменных (потому что в моем скрипте я использую только $1, $2 и так далее)? Чтобы быть более точным, все, что я хочу, это просто передать аргументы сценарию. - person Perlnika; 25.02.2013
comment
Меня также не волнуют имена переменных — я предпочитаю, чтобы скрипт анализировал параметры, как обычно, при запуске непосредственно из терминала, даже при запуске с помощью qsub. - person David Doria; 18.04.2014

В дополнение к ответу 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

Надеюсь это поможет!

person jhrf    schedule 12.06.2013
comment
@_jhrf Думаю, ты хотел $bar - person Manolete; 18.08.2014
comment
Ты прав. Я много раз просматривал этот ответ и не видел этой ошибки! Спасибо. - person jhrf; 26.08.2014
comment
@Manolete и @jhrf, потому что вы специально указали bash, в данном случае это не имеет значения. Хотя `=` (с пробелами является проблемой синтаксиса...). См. отличный ответ, почему здесь работают $bar и ${bar} :) - person svenevs; 20.08.2017

Я только что понял, как это решить: просто вывести команды скрипта оболочки с эхом и передать результат в qsub:

echo "./script.sh var1=13 var2=24" | qsub

person Martin    schedule 01.09.2010
comment
ваш ответ должен быть более явным - приведите пример - person Jeremy Leipzig; 23.11.2010
comment
Кажется, моя 11354348">проблема аналогична. Как мне изменить мой скрипт bash? Можете привести пример. - person lovespeed; 06.07.2012
comment
Проблема в этом ответе заключается в том, что имя задания всегда STDIN (как указано в qstat -a), по крайней мере, для моего случая. - person hammady; 14.01.2014
comment
@hammady просто используй echo "./script.sh var1=13 var2=24" | qsub -N myjobname - person Aurélien Ooms; 20.08.2014
comment
Я боюсь, что это просто запустит script.sh на узле, где выполняется qsub, а не в кластере. - person becko; 28.01.2015
comment
В моей версии qsub (вероятно, Univa Grid Engine, это написано в man, но нет опции --version) — ничего не написано о чтении ввода. Боюсь, это не портативно и не надежно. В любом случае, рад, что это работает для вас. - person Yaroslav Nikitenko; 29.03.2020

Существует лучший способ...

Я действительно удивлен тем, как долго этот вопрос оставался без хорошего ответа. Возможно, конкретная версия qsub не была указана. qsub существует по крайней мере в Torque, а также в Sun Grid Engine, возможно, в других планировщиках. Итак, важно знать, что вы используете. Я расскажу о некоторых здесь:

КРУТЯЩИЙ МОМЕНТ: qsub -F <arguments> command

справочная страница
пример того, как я обычно его использую. Начиная с этого примера сценария, который просто повторяет любые переданные ему аргументы:

$ cat testArgs.pbs
#!/usr/bin/env bash

echo $@

Я бы представил работу так:

$ 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 ]

справочная страница
Здесь я отправляю тот же скрипт, что и в приведенном выше примере Torque:

$ 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.

person calico_    schedule 20.09.2017
comment
Спасибо! В моей среде man qsub говорит, что нет опции -F, но я все равно попробовал, и это работает! Вероятно, эта опция была добавлена ​​недавно. Но это правильный ответ на этот вопрос. - person Fil; 26.01.2018
comment
Спасибо! Я использую qsub (Sun Grid Engine), и он работает! обратите внимание, что вам не нужно добавлять команду в качестве ключевого слова. qsub script.sge arguments - person Pengyao; 22.02.2018