简单的 cp 命令不起作用(在 shell 脚本内并在集群上使用 sbatch 提交)

简单的 cp 命令不起作用(在 shell 脚本内并在集群上使用 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/ ./,线路无法正常工作。脚本不会超出这条线。它复制一个文件,仅此而已..它停止做任何有成效的事情。它将“更改的目录”打印到日志中,而不打印任何其他内容。

两个奇怪的事情:(1)“cp”(vi 内)的颜色与其他命令不同,(2)当我检查 squeue 时,作业似乎正在运行,但实际上没有发生任何事情(就好像它处于循环中一样)。

相关目录结构如下(树的输出)。

|-- 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 shell,例如sh.根据您的操作系统,您sh将是一个简单的 POSIX shell dash(例如在 Debian 或 Ubuntu 上),或者可能bash在 POSIX 模式下运行。无论哪种情况,${d%?}都不会被理解,这很可能会破坏您的脚本。

一个简单的解决方案是使用#!/bin/bash来运行它。但是,您的脚本似乎也不必要地复杂。一方面,${d%?}只是从目录名称中删除尾部斜杠,但这样做根本没有任何好处:

$ d="bar/"
$ cd $d
$ pwd
/home/terdon/foo/bar

在目录名末尾有一个(或多个)斜杠是可以的。你也可以这样cd barcd 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 风格的 shell。你唯一的困扰就是${d%?}无论如何,所以删除它应该可以解决你所有的问题。

相关内容