単純なcpコマンドは機能しません(シェルスクリプト内のクラスタでsbatchコミットを使用)。

単純なcpコマンドは機能しません(シェルスクリプト内のクラスタでsbatchコミットを使用)。

私は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など)を使用したり、bashPOSIXモードで実行したりできます。どちらの場合も${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あなたの説明によれば、おそらくスクリプトを実行してshshebangを無視するように聞こえます。上記のバージョンを試すsbatch bash MyScript.shか、単に試してみることもできます。すべてのshスタイルシェルに移植可能でなければなりません。とにかく唯一の問題はそれがあるため、${d%?}削除するとすべての問題が解決されます。

関連情報