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

Java Bash-部署和运行jar文件的脚本,java,bash,remote-access,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;

我在分布式系统上工作,我的程序已经完成,我已经对它进行了测试,它在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进程在每台机器上运行


顺便说一句:这2&就是说,在运行每个jar之后,脚本不会卡住。我建议使用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
请注意这里的单个符号AND,它位于引号之外(因此它在您的客户机上运行,而不是在服务器上运行)。您无法将SSH会话发送到后台,因为父会话将被终止

为了尽量减少连接数量,我将其分成一行(第一个
cat
命令将文件转储到标准输出中,而第二个
cat
命令将标准输入(myJar.jar的内容)写入目标位置)。我不确定是否可以直接通过管道将其传输到java(
cat myJar.jar | ssh)user@host“cd-someFolder;java-jar-”
),所以我不去管它


我假设您不必从someFolder的父级运行.jar。实际位于目标目录中似乎更简单。如果目标目录可能不存在,请添加
mkdir-psomefolder
cd
命令之前。如果目录已经存在,
-p
将确保不会发生任何事情。如果必须从父级运行它,请删除
cd
命令并将“myJar.jar”替换为“someFolder/myJar.jar”

IP和
“java
之间是否没有空间?复制粘贴错误,现已修复