在单独的目录中为每个 运行 编写一个配置文件,然后启动 mpi运行
Write a configuration file for each run in a separate directory, then launch mpirun
我需要通过每次更改一个参数来进行一组计算。计算目录包含一个名为 'test.ctrl' 的控制文件、一个名为 'job-test' 的作业提交文件和一堆数据文件。每个计算都应使用相同的控制文件名(写在作业测试中)提交,并且输出在这些数据文件中给出而不更改它们的名称,这会产生覆盖问题。出于这个原因,我想使用 bash 脚本自动化作业提交过程,这样我就不需要手动提交每个计算。
举个例子,我在目录b1-k1-a1中做了第一次计算(我选择这种格式的目录名来表示计算参数)。此 test.ctrl 文件具有参数:
Beta=1
Kappa=1
Alpha=0 1
并且我使用 'sbatch job-test' 命令提交了这份工作。对于以下计算,我的代码应该复制整个目录,名称为 bX-kY-aZ,在控制文件中进行更改,最后提交作业。我天真地尝试将整个内容写入作业测试文件,如下面的 MWE 所示:
#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00 ##hh:mm:ss
for n in $(seq 0 5)
do
for m in $(seq 0 5)
do
for v in $(seq 0 5)
do
mkdir b$n-k$m-a$v
cd b$n-k$m-a$v
cp ~/home/b01-k1-a01/* .
sed "s/Beta=1/Beta=$n/" test.ctrl
sed "s/Kappa=1/Kappa=$m/" test.ctrl
sed "s/Alpha=0 1/Alpha=0 $v/" test.ctrl
cd ..<<EOF
EOF
mpirun soft.x test.ctrl
sleep 5
done
done
done
如果你能建议我如何让它以这种方式工作,我将不胜感激。
在我将 cd ..
移动到循环的最后并删除 sed 后,它起作用了,如评论中所建议的那样。因此现在可以使用了:
#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00 ##hh:mm:ss
for n in $(seq 0 5)
do
for m in $(seq 0 5)
do
for v in $(seq 0 5)
do
mkdir b$n-k$m-a$v
cd b$n-k$m-a$v
cp ~/home/b01-k1-a01/* .
cat >test.ctrl <<EOF
Beta=$n
Kappa=$m
Alpha=0 $v
EOF
mpirun soft.x test.ctrl
sleep 5
cd ..
done
done
done
直接的问题是sed
没有任何选项根本不修改文件;它只是将结果打印到标准输出。
非常不清楚您希望此处的文档完成什么。 cd
不读取其标准输入,因此它根本没有完成任何事情。
#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00 ##hh:mm:ss
for n in $(seq 0 5); do
for m in $(seq 0 5); do
for v in $(seq 0 5); do
mkdir "b$n-k$m-a$v"
cd "b$n-k$m-a$v"
cp ~/home/b01-k1-a01/* .
sed -e "s/Beta=1/Beta=$n/" \
-e "s/Kappa=1/Kappa=$m/" \
-e "s/Alpha=0 1/Alpha=0 $v/" ~/home/b01-k1-a01/test.ctrl >/test.ctrl
mpirun soft.x test.ctrl
cd ..
sleep 5
done
done
done
还要注意将多个 sed
命令合并到一个脚本中(尽管如其他地方所述,如果这是配置文件中的所有内容,也许 printf
会更好)。
我需要通过每次更改一个参数来进行一组计算。计算目录包含一个名为 'test.ctrl' 的控制文件、一个名为 'job-test' 的作业提交文件和一堆数据文件。每个计算都应使用相同的控制文件名(写在作业测试中)提交,并且输出在这些数据文件中给出而不更改它们的名称,这会产生覆盖问题。出于这个原因,我想使用 bash 脚本自动化作业提交过程,这样我就不需要手动提交每个计算。
举个例子,我在目录b1-k1-a1中做了第一次计算(我选择这种格式的目录名来表示计算参数)。此 test.ctrl 文件具有参数:
Beta=1
Kappa=1
Alpha=0 1
并且我使用 'sbatch job-test' 命令提交了这份工作。对于以下计算,我的代码应该复制整个目录,名称为 bX-kY-aZ,在控制文件中进行更改,最后提交作业。我天真地尝试将整个内容写入作业测试文件,如下面的 MWE 所示:
#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00 ##hh:mm:ss
for n in $(seq 0 5)
do
for m in $(seq 0 5)
do
for v in $(seq 0 5)
do
mkdir b$n-k$m-a$v
cd b$n-k$m-a$v
cp ~/home/b01-k1-a01/* .
sed "s/Beta=1/Beta=$n/" test.ctrl
sed "s/Kappa=1/Kappa=$m/" test.ctrl
sed "s/Alpha=0 1/Alpha=0 $v/" test.ctrl
cd ..<<EOF
EOF
mpirun soft.x test.ctrl
sleep 5
done
done
done
如果你能建议我如何让它以这种方式工作,我将不胜感激。
在我将 cd ..
移动到循环的最后并删除 sed 后,它起作用了,如评论中所建议的那样。因此现在可以使用了:
#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00 ##hh:mm:ss
for n in $(seq 0 5)
do
for m in $(seq 0 5)
do
for v in $(seq 0 5)
do
mkdir b$n-k$m-a$v
cd b$n-k$m-a$v
cp ~/home/b01-k1-a01/* .
cat >test.ctrl <<EOF
Beta=$n
Kappa=$m
Alpha=0 $v
EOF
mpirun soft.x test.ctrl
sleep 5
cd ..
done
done
done
直接的问题是sed
没有任何选项根本不修改文件;它只是将结果打印到标准输出。
非常不清楚您希望此处的文档完成什么。 cd
不读取其标准输入,因此它根本没有完成任何事情。
#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00 ##hh:mm:ss
for n in $(seq 0 5); do
for m in $(seq 0 5); do
for v in $(seq 0 5); do
mkdir "b$n-k$m-a$v"
cd "b$n-k$m-a$v"
cp ~/home/b01-k1-a01/* .
sed -e "s/Beta=1/Beta=$n/" \
-e "s/Kappa=1/Kappa=$m/" \
-e "s/Alpha=0 1/Alpha=0 $v/" ~/home/b01-k1-a01/test.ctrl >/test.ctrl
mpirun soft.x test.ctrl
cd ..
sleep 5
done
done
done
还要注意将多个 sed
命令合并到一个脚本中(尽管如其他地方所述,如果这是配置文件中的所有内容,也许 printf
会更好)。