【问题标题】:Bash - Script to deploy and run jar filesBash - 部署和运行 jar 文件的脚本
【发布时间】:2014-04-30 17:48:40
【问题描述】:

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

顺便说一句:这两个 & 是所以脚本在运行每个 jar 后不会卡住

【问题讨论】:

  • IP和"java之间没有空格吗?
  • 复制粘贴错误,现已修复

标签: java bash remote-access


【解决方案1】:

我建议使用 SSH 密钥,而不是在命令中表达密码(它会被记录并且对其他用户可见,更不用说它在您的脚本中的存在了)。 github ssh key generation docs 非常适合这个(添加,附加到服务器的 ~/.ssh/authorized_keys 文件)。

在客户端生成密钥并将其公钥添加到服务器后,您应该能够运行:

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

注意那里的 single 符号,它在引号之外(因此它在您的客户端上运行,而不是在您的服务器上运行)。您不能将 SSH 会话发送到后台,因为父级会被杀死。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 2021-12-25
    • 2020-09-14
    • 2013-03-09
    • 2023-03-19
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多