我想有一个脚本在另一台服务器上启动服务。
我已经测试过该脚本在服务器运行的服务器中按预期工作。
这是启动服务并监视日志的代码,直到它处于启动过程中:
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,但我仍然可以找到原因。
似乎问题来自执行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
但是这个最后的解决方案可能导致某些特性的其他问题,所以除非有人建议另一个解决方案,这是我的补丁,使其工作。