远程执行脚本时,脚本卡在读取行中

时间:2019-04-08 16:18:04

标签: bash ssh remote-server

我想要一个可以在另一台服务器上启动服务的脚本。

我已经测试了脚本在要运行服务器的服务器中可以正常工作。

这是启动服务并监视日志直到其处于启动过程的代码:

   pkill -f "$1"
   nohup java -jar -Dspring.profiles.active=$PROFILE $1 &

   tail -n 0 -f nohup.out | while read LOGLINE
   do
       echo $LOGLINE
       [[ "${LOGLINE}" == *"$L_LOG_STRING"* ]] && pkill -P $$ tail
   done

只要我从那台机器上执行该命令,此命令就可以正常工作。

现在我想从另一台服务器调用该脚本:

#!/usr/bin/env bash
DESTINATION_SERVER=$1
ssh root@$DESTINATION_SERVER /bin/bash << EOF
    echo "Restarting first service..."
    /usr/local/starter.sh -s parameter

    echo "Restarting second service..."
    /usr/local/starter.sh -s parameter2
EOF

好吧,每次我尝试将远程服务器的脚本卡在“ while READ”循环中时。但是正如我说的,当我从服务器本地执行它时,它工作正常,在我的“非简化脚本”中,我没有使用任何系统变量或类似变量。

更新:在第一种情况下,我尝试使用以下几行代码进一步简化代码:

pkill -f "$1"
nohup java -jar -Dspring.profiles.active=$PROFILE $1 &
tail -n 0 -f nohup.out | sed "/$L_LOG_STRING/ q"

我会说问题在于“ |”中的方式通过ssh,但我仍然可以找到原因。

1 个答案:

答案 0 :(得分:0)

问题似乎出在执行ssh命令时没有交互式控制台,因此nohup命令的行为异常。

我可以通过两种方式解决它,将代码显式输出到文件中:

"nohup java -jar -Dspring.profiles.active=test &1 >> nohup.out &"

代替:

"nohup java -jar -Dspring.profiles.active=test &1&"

或通过添加tt选项更改通过ssh访问的方式(只是其中一个无效):

ssh -tt root@$DESTINATION_SERVER /bin/bash << EOF

但是最后一个解决方案可能会导致某些字符出现其他问题,因此除非有人提出另一个解决方案是我的补丁程序,否则它会起作用。