さまざまなパラメータを使用してPythonスクリプトを複数回実行したいと思います。これを行うには、次のbashスクリプトを作成しました。
requests=(25 50 75 100)
factors=(3 6)
graphsizes=(25 50 75)
for request in "${requests[@]}"; do
for factor in "${factors[@]}"; do
for size in "${graphsizes[@]}"; do
echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log &
echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
done
done
done
;
echo
並列に実行したくないので、最初と最後に追加しました。実際、私はPythonスクリプトへのすべての呼び出しがmain.py
並列ではなく逐次実行されることを望んでいます。これは、スクリプト自体がすでに並列化されており、競合状態を必要としないためです。
;
通常、タスクを順番に実行するためにaを使用していることはわかっていますが、&
nohup行の後にこれを実行するとエラーが発生します。
syntax error near unexpected token `;'
ループの各反復を順次実行するにはどうすればよいですか?
答え1
複数行でスクリプトを作成した方法では、「;」は改行文字として暗示されます。最も内側のループ内の3行の末尾にある ";"を削除すると、for
スクリプトは順番に実行されます。 specとdo
同じ行に項目を配置するときなど、項目間に区切り線が必要な同じ行に項目を移動する場合にのみ、 ';'が必要です。for
以下の書き換えスクリプトの代替場所を参照してください。do
for request in "${requests[@]}"
do
for factor in "${factors[@]}"
do
for size in "${graphsizes[@]}"
do
echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out
echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log
echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out
done
done
done
答え2
組み合わせの数が増えると、コンピュータが圧倒されます。
これはGNU Parallelが便利な場所です:
nohup parallel -j100% --header : python3 -u main.py {request} 50 {factor} {size} '>' {request}_{factor}_{size}.log \
::: request 25 50 75 100 \
::: factor 3 6 \
::: size 25 50 75
CPUコアごとに1つのジョブを実行したくない場合は、-j100%を変更してください。