我在分布式系统上工作并且我的程序已经完成,我已经对其进行了测试,并且可以在10台计算机上正常运行,但是每次我要测试该程序时,我都必须:-复制每台计算机的文件-ssh到每台计算机并键入“ java -jar文件”
为了避免痛苦的过程,我做了这个
for i in {1..11}
do
if [ $i -ne 6 ];
then
sshpass -p "qwerty" scp myJar.jar user@l040101-ws$i.XXXX.XX.XX:someFolder;
sshpass -p "qwerty" ssh user@l040101-ws$i.XXXX.XX.XX "java -jar someFolder/myJar.jar &" &
fi
done
由于某种原因,它不能按预期方式工作,因此scp命令将按应有的方式执行,而另一个则不能。
该程序应该产生一个带有2个日志的文件夹,如果我手动执行它,那么我想这不是权限问题,但不是脚本问题。奇怪的是,如果我跑得最高,我可以看到每台机器上运行的java进程。
顺便说一句:那些2&是这样,所以在运行每个jar时脚本不会卡住
我建议您使用SSH密钥,而不要在命令中表达密码(该命令会被记录并且对其他用户可见,更不用说在脚本中显示该密码了)。在GitHub的SSH密钥生成的文档是本不错(添加,添加到服务器的〜/ .ssh / authorized_keys文件)。
在客户端上生成密钥并将其pubkey添加到服务器后,您应该能够运行:
for i in {1..11}
do
if [ $i -ne 6 ] # skip server six
then
cat myJar.jar |ssh user@l040101-ws$i.XXXX.XX.XX \
"cd someFolder; cat > myJar.jar; java -jar myJar.jar" &
fi
done
请注意单引号“”,该引号在引号之外(因此它在您的客户端上运行,而不是在服务器上运行)。您不能将SSH会话发送到后台,因为父会话将被杀死。
为了将连接数减至最少,我将其分成一行(第一个cat
命令将文件转储到标准输出中,而第二个cat
命令将标准输入(myJar.jar的内容)写入目标位置)。我不确定是否可以直接将其直接传递给java(cat myJar.jar |ssh user@host "cd someFolder; java -jar -"
),所以我不理会它。
我假设您不必从someFolder的父级运行.jar。实际上位于目标目录中似乎更简单。如果有可能目标目录不存在,请mkdir -p someFolder;
在cd
命令前添加。-p
如果目录已经存在,这将确保不发生任何事情。如果必须从父级运行它,请删除cd
命令,然后将“ myJar.jar”替换为“ someFolder / myJar.jar”
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句