远程执行脚本时,脚本在读取行期间卡住

问题描述 投票:0回答:1

我想有一个脚本在另一台服务器上启动服务。

我已经测试过该脚本在服务器运行的服务器中按预期工作。

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

   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,但我仍然可以找到原因。

bash ssh remote-server
1个回答
0
投票

似乎问题来自执行ssh命令时没有交互式控制台,因此nohup命令行为严格。

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

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

代替:

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

或者改变我通过ssh添加tt选项访问的方式(只有一个不起作用):

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

但是这个最后的解决方案可能导致某些特性的其他问题,所以除非有人建议另一个解决方案,这是我的补丁,使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.