我在分布式系统上工作,我的程序已经完成,我已经测试了它,并且运行良好的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个日志的文件夹,如果我手动执行它,所以我猜这不是权限问题,但不是脚本。 如果我运行top,我可以看到每台机器上运行的java进程。
BTW:那些2&是这样的,运行每个jar后脚本都不会卡住答案 0 :(得分:0)
我建议使用SSH密钥,而不是在命令中表达密码(该密码会被记录并且对其他用户可见,更不用说它在脚本中的存在)。 github ssh key generation docs对此非常有用(添加,附加到服务器的〜/ .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”