Bash-部署和运行jar文件的脚本

为什么

我在分布式系统上工作并且我的程序已经完成,我已经对其进行了测试,并且可以在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时脚本不会卡住

亚当·卡兹(Adam Katz)

我建议您使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章