slurmで実行すると、bashのforループは無限に実行されます。

slurmで実行すると、bashのforループは無限に実行されます。

次のコードブロックを含むedit.shというbashスクリプトがあります。

z=$(tail -1 mol-pos-1.xyz | awk '{print $NF}')

echo "before loop: z is $z" >> log

for ((r=0; $(echo "$z>20" | bc -l); r++)); do
    echo "entering loop" >> log

    ll=$(tail -n 1 mol-1.restart)

    if echo "$ll" | grep -q "&END FORCE_EVAL"; then   #check whether mol-1.restart file is written properly
        cp mol-1.restart run.inp
        echo "copied into run.inp" >> log 
        # See https://en.wikipedia.org/wiki/CP2K for a description 
        # of CP2K
        cp2k.popt run.inp >> output$r.out 2>> error$r.err &
        wait

        echo "inside if" >> out
    fi

    echo "done running cp2k after $r repeats" >> log
    z=$(tail -1 mol-pos-1.xyz | awk '{print $NF}')
    echo "z is $z" >> log
done

echo "left loop successfully" >> log

ノードでこのスクリプトを手動で実行すると、正常に実行されます。しかし、私がそれを実行するときスラム, 私は多くの output$r.out および error$r.err ファイルのために無限ループに陥りました。また、ログファイルはループが無限に実行されていることを示します。

ただし、すべての output$r.out および error$r.err ファイルは完全に空です。環境/パスの問題ではありません。そうしないと、このファイルでいくつかのエラーが発生するためです。手動で実行しても実行されません。

私は何が起こっているのか分かりません。

slurm スクリプトには、次のコミットコマンドがあります。

EXEC="sh edit.sh"
FILE=depo
(mpiexec.hydra -launcher=ssh -genv I_MPI_PIN_PROCESSOR_LIST $(echo "${irun}" | awk '{print $1*1}') -genv OMP_NUM_THREADS 1 -np 1 ${EXEC} ${FILE}.inp >> ${FILE}.out 2>> ${FILE}.err || exit 1) &

このコマンドが正しく機能しないのはなぜですか?

ベストアンサー1

おすすめ記事