Pinned📌

About Me

qsubで、def_slot のスロット数を qsub -v オプションで引数として設定するという方法は、直接的にはできない

 def_slot のスロット数を qsub -v オプションで引数として設定するという方法は、直接的にはできません。qsub -v は環境変数をジョブに渡すためのオプションであり、#$ -pe def_slot N のようにジョブの並列環境自体を設定するものではないためです。

前述の通り、スロット数を変数で指定するには、主に以下の2つの方法があります。

1. qsub コマンド自体にオプションとして渡す方法

これが最もシンプルで推奨される方法です。

Bash
#!/bin/bash
N=4  # 必要なスロット数を変数に格納
qsub -pe def_slot $N your_script.sh

この方法では、qsub コマンドを実行する際に -pe def_slot $N のように指定することで、変数 $N の値が展開され、qsub に渡されます。your_script.sh は実際のジョブスクリプトです。

2. envsubst を使う方法

envsubst を使う方法は、スクリプト内で変数を展開してから qsub に渡す方法です。少し複雑ですが、スクリプト内で他の設定も変数で管理したい場合などに有効です。

Bash
#!/bin/bash
N=4
export N # envsubst に変数を認識させるために export が必要
cat << EOF | envsubst | qsub -
#!/bin/bash
#$ -pe def_slot ${N}
# 他のqsubオプションも変数で管理できる例
#$ -l mem_free=${MEM}G
# ここにジョブの内容
echo "Using ${N} slots and ${MEM}GB of memory."
EOF

この方法では、cat << EOF ... EOF でヒアドキュメントを作成し、envsubst に渡すことで、${N} が展開された状態で qsub に渡されます。${N} のように {} で囲むことで、変数名と後続の文字列が結合してしまうのを防ぐことができます。また、他のリソース要求(例:メモリ量 mem_free)も変数で管理できます。

なぜ qsub -v ではダメなのか?

qsub -v は、ジョブスクリプト内で使用する環境変数を設定するために使用されます。例えば、以下のように使用します。

Bash
#!/bin/bash
MY_VAR="my_value"
qsub -v MY_VAR my_script.sh

my_script.sh 内では $MY_VAR を参照することができ、値 "my_value" を取得できます。

しかし、#$ -pe def_slot N は、ジョブが実行される並列環境を定義するものであり、ジョブスクリプト内で使用する変数とは性質が異なります。そのため、qsub -v でスロット数を設定することはできません。

まとめ

def_slot のスロット数を変数で指定する場合は、qsub コマンドに直接オプションとして渡す方法(上記の方法1)が最も簡単で推奨されます。envsubst を使う方法は、他の設定も変数で管理したい場合などに有効です。qsub -v はジョブスクリプト内で使用する環境変数を設定するためのものであり、スロット数の設定には使用できません。

もし、上記の方法でうまくいかない場合は、以下の情報を提供していただけると、より具体的なアドバイスができます。

  • 使用しているGrid Engineの種類(SGE、OGE、SGEなど)
  • 具体的なスクリプト例
  • エラーメッセージ(もしあれば)

これらの情報があれば、問題の特定と解決がより容易になります。