私はRHELを実行しているクラスタで作業しており、次のコマンドを使用してジョブを送信しています。
sbatch MyScript.sh
MyScript.shの内容は次のとおりです。
#!/bin/sh
# ....
# Other SBATCH related commands are here
# ....
## Script begins here
for d in lambda.*/
do
cd ${d%?}
echo "Changed Directory"
cp -r ../Transfer/${d%?}/ENMIN/ ./
echo "Transferred"
rm -rf ../Transfer/${d%?}
echo "Removed"
cd ENMIN
time mpirun -np $SLURM_NTASKS gmx_mpi mdrun -v -stepout 1000 -s enmin.tpr -deffnm enmin
echo "Energy minimization done of $d cycle"
echo "Copying to OutboundTransfer"
mkdir ../../Transfer/${d%?}
cp -r ../ENMIN ../../Transfer/${d%?}
echo "Copied"
cd ../../
done
問題は配線にありますcp -r ../Transfer/${d%?}/ENMIN/ ./
。配線が正しく動作しません。スクリプトはこの行を超えません。ファイルをコピーすると、それはすべてです。生産的な作業を中止します。 「変更されたディレクトリ」をログに印刷し、それ以外は何も印刷しません。
2つの奇妙な点:(1)「cp」(viの内部)は、他のコマンドと色が異なります。 (2)スキューを確認すると、ジョブが実行されているように見えますが、実際には何も起こりません。 in) と同じループです。
そのディレクトリ構造は次のとおりです(ツリー出力)。
|-- lambda.00
|-- lambda.01
|-- lambda.02
|-- lambda.03
|-- lambda.04
|-- lambda.05
|-- lambda.06
|-- lambda.07
|-- lambda.08
|-- lambda.09
|-- lambda.10
|-- lambda.11
|-- lambda.12
|-- lambda.13
|-- lambda.14
|-- lambda.15
|-- lambda.16
|-- lambda.17
|-- lambda.18
|-- lambda.19
|-- lambda.20
|-- lambda.21
|-- lambda.22
|-- lambda.23
|-- lambda.24
|-- lambda.25
|-- lambda.26
|-- lambda.27
|-- lambda.28
|-- lambda.29
`-- Transfer
|-- lambda.00
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.01
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.02
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.03
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.04
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.05
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.06
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.07
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.08
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.09
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.10
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.11
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.12
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.13
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.14
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.15
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.16
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.17
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.18
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.19
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.20
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.21
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.22
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.23
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.24
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.25
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.26
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.27
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
|-- lambda.28
| `-- ENMIN
| |-- enmin.tpr
| `-- mdout.mdp
`-- lambda.29
`-- ENMIN
|-- enmin.tpr
`-- mdout.mdp
このクラスターの制御力は限られています。このスクリプトを機能させるにはどのようなオプションが必要ですか?
答え1
この${d%?}
設定は、たとえばPOSIXシェルでは機能しませんsh
。オペレーティングシステムによっては、sh
単純なPOSIXシェルdash
(DebianやUbuntuなど)を使用したり、bash
POSIXモードで実行したりできます。どちらの場合も${d%?}
理解できないため、スクリプトが破損する可能性が高くなります。
簡単な解決策は#!/bin/bash
。しかし、スクリプトも不必要に複雑に見えます。一方では、${d%?}
ディレクトリ名から末尾のスラッシュを削除するだけで問題になりますが、まったく役に立ちません。
$ d="bar/"
$ cd $d
$ pwd
/home/terdon/foo/bar
ディレクトリ名の末尾に1つ以上のスラッシュがあっても大丈夫です。これcd bar
を行うcd bar/
かcd bar//////////
。
cd
つまり、最初は必要ではなく、理由がなく複雑性階層を追加するだけです。以下はスクリプトの単純化されたバージョンです。
#!/bin/bash
for d in lambda.*/
do
mv Transfer/"$d"/ENMIN/ "$d"
echo "Transferred"
( ## open a subshell so the cd only hapens in the subshell
## and doesn't affect the script
cd "$d"/ENMIN/ &&
time mpirun -np $SLURM_NTASKS gmx_mpi mdrun -v -stepout 1000 -s enmin.tpr -deffnm enmin
)
echo "Energy minimization done of $d cycle"
echo "Copying to OutboundTransfer"
mkdir Transfer/"$d"
cp -r "$d"/ENMIN Transfer/"$d"
echo "Copied"
done
これがどのように機能するのかわかりませんが、sbatch
あなたの説明によれば、おそらくスクリプトを実行してsh
shebangを無視するように聞こえます。上記のバージョンを試すsbatch bash MyScript.sh
か、単に試してみることもできます。すべてのshスタイルシェルに移植可能でなければなりません。とにかく唯一の問題はそれがあるため、${d%?}
削除するとすべての問題が解決されます。