web-dev-qa-db-ja.com

qsubで開始されるシェルスクリプトのパラメーター

(qsubで始まる)グリッドで実行されるシェルスクリプトをパラメーター化するにはどうすればよいですか?私はgetoptsを使用してパラメーターを読み取るシェルスクリプトを持っています。

(qsub script.sh -r firstparam -s secondparam ..)を開始すると、qsubでこの作業スクリプトがエラーメッセージを受け取ります。

qsub:無効なオプション-s

qsub:不正な-r値

qsubは、パラメーターはそれ自体のものであると考えています。まだ解決策を見つけていません。

ありがとう

43
Martin

私はそれを解決する方法を理解しました:エコー付きのシェルスクリプトのコマンドを出力し、結果をqsubにパイプします:

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

20
Martin

Qsub -vオプションを使用するのが適切な方法です。

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

par_nameは、シェルスクリプトで変数として使用できます。

44
volks

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

お役に立てれば!

35
jhrf

もっと良い方法があります...

この質問が適切な回答なしにどれほど長く続いたのかに本当に驚いています。 qsubの特定のバージョンが指定されなかった可能性があります。 qsubは少なくともTorqueに存在し、Sun Grid Engineにも存在する可能性があります。したがって、どちらを使用しているかを知ることが重要です。ここでいくつか話します。

トルク:qsub -F <arguments> command

manページ
これが私が通常それをどのように使用するかの例です。渡された引数をエコーするこのサンプルスクリプトから始めます。

$ 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

Sun Grid Engine:qsub command [ command_args ]

manページ
シェルで実行する場合と同じように、コマンドの後に引数を追加するだけです。私はSGEをどこでも実行していないので、この例はありません。しかし、それは以下にあるSlurmと同じです

スラム:sbatch command [ command_args ]

manページ
ここでは、上記のトルクの例で使用したのと同じスクリプトを送信します。

$ 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

12
calico_