我想要一个可以在另一台服务器上启动服务的脚本。
我已经测试了脚本在要运行服务器的服务器中可以正常工作。
这是启动服务并监视日志直到其处于启动过程的代码:
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,但我仍然可以找到原因。
答案 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
但是最后一个解决方案可能会导致某些字符出现其他问题,因此除非有人提出另一个解决方案是我的补丁程序,否则它会起作用。