Ami*_*mit 2 cp shell-script cluster
我正在运行 RHEL 的集群上工作,并使用以下命令提交作业。
sbatch MyScript.sh
Run Code Online (Sandbox Code Playgroud)
MyScript.sh的内容如下。
sbatch MyScript.sh
Run Code Online (Sandbox Code Playgroud)
问题出在线路上cp -r ../Transfer/${d%?}/ENMIN/ ./
,线路无法正常工作。脚本不会超出这条线。它复制一个文件,仅此而已..它停止做任何有成效的事情。它将“更改的目录”打印到日志中,而不打印任何其他内容。
两个奇怪的事情:(1)“cp”(vi 内)的颜色与其他命令不同,(2)当我检查 squeue 时,作业似乎正在运行,但实际上没有发生任何事情(就好像它处于循环中一样)。
相关目录结构如下(树的输出)。
#!/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
Run Code Online (Sandbox Code Playgroud)
我对这个集群的控制有限。我可以选择哪些选项来使该脚本正常工作?
该${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
Run Code Online (Sandbox Code Playgroud)
在目录名末尾有一个(或多个)斜杠是可以的。你也可以cd bar
这样做cd bar/
或cd bar//////////
。
也就是说,cd
首先也没有必要,这只会无缘无故地增加一层复杂性。这是脚本的简化版本:
$ d="bar/"
$ cd $d
$ pwd
/home/terdon/foo/bar
Run Code Online (Sandbox Code Playgroud)
我不知道如何sbatch
工作,但从您的描述来看,听起来它很可能正在运行脚本sh
,而忽略了 shebang。您也可以尝试sbatch bash MyScript.sh
或简单地尝试我上面的版本,它应该可以移植到任何 sh 风格的 shell。你唯一的困扰就是无论如何${d%?}
,所以删除它应该可以解决你所有的问题。