我在并行网络中有 4 个 CPU,并且希望在这 4 个 CPU 中的每一个上运行 N 个作业。我还想将 N 个作业分成 X 个作业,并在 4 个 CPU 上的每个 CPU 上将其作为循环运行。 bash 脚本如下所示:
#!/bin/bash
runevents() {
nEvents=5000
nJobs=100
ePerJob=$((nEvents/nJobs))
ssh $1
for ((i=0; i<nJobs; i++))
do
dir_run=/home/user/task/
"cd $dir_run && nice -n0 ./commandscript -c commandscipt.cmnd -o results/job_$RANDOM -s $RANDOM -n $ePerJob >$dir_run/job_$RANDOM.out"
done
}
runevents cpu1
runevents cpu2
runevents cpu3
runevents cpu4
exit
但这并没有按预期工作。它给出了文件或路径不存在的错误,文件或路径存在且路径正确。另外,如果我将该行修改为:
ssh $1 "cd $dir_run && nice -n0 ./commandscript -c commandscipt.cmnd -o results/job_$RANDOM -s $RANDOM -n $ePerJob >$dir_run/job_$RANDOM.out"
它可以工作,但随后会像 nJobs 一样多次询问密码,这是一种荒谬的方法。我在远程机器上使用了 ssh-keygen,比如 cpu1 (也是并行网络的一部分),我在其中编译生成commandscript.cc
密钥对ssh-keygen -t rsa
,私钥存储在id_rsa
和 中authorized_keys
,公钥存储在id_rsa.pub
和 中authorized_keys.pub
。对解决这种情况有什么见解吗?我没有 sudo 访问并行网络的权限。
答案1
要求输入密码的次数与 nJobs 一样多,这是一种荒谬的方法。
为自己创建一个 ssh 密钥对(带有ssh-keygen
),使用ssh
/scp
以您有权访问远程计算机的用户身份登录,并将该对的公钥存储在 中~/.ssh/authorized_keys
。不需要sudo
。
但这并没有按预期工作。 [...]如果我将该行修改为:
您自己已经解决了这个问题。
还可以看看平行以及远程主机列表。可能会节省你一些脚本编写的时间。