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

时间:2014-04-30 17:48:41

标签: java bash remote-access

我在分布式系统上工作,我的程序已经完成,我已经测试了它,并且运行良好的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后脚本都不会卡住

1 个答案:

答案 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”