进程重启的 BASH 脚本帮助

进程重启的 BASH 脚本帮助
#!/bin/bash

check=`monStatus.sh -p appName:Tomcat |head -2 |tail -1 | nawk '{print $2}'`

if [ "$check" != "offline" ]; then
  #echo "Tomcat still running"
  sleep 90
else
  #echo "Restarting Tomcat"
  RestartTomcat.sh
fi

这是 shell 代码片段。我的问题是这样的。我需要第一个 then 像sleep 90AND 一样,然后再次运行 if/then/else 语句,直到它在 else 上完成,然后一旦 Tomcat 没有显示正在运行,它就会重新启动。我无法理解如何循环它。

答案1

如果你需要不断重复脚本,你可以使用嵌套 while环形:

while true; do
    # Do something, for example output the current date and time:
    printf '%(%c)T\r' -1 
done
  • 在您的示例代码中,您使用的是旧样式的子 shell 输出包装。@ThomasWard说:“大多数 Bash 指南不建议使用反引号,而是建议将命令包装在内$( ),即$(monStatus.sh -p appName:Tomcat | head -2 | tail -1 | nawk '{print $2}')。这实际上是现在将子 shell 输出捕获作为变量或替换的更推荐的方法。”

    作为@甜点说,“请注意,反引号和语法之间实际上是有区别的$(…):当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着$`或。——比较和\的输出!”echo $(echo \\ )echo `echo \\ `

  • 此外,您还可以简化一些事情:

    使用nawk 'FNR==2{print $2}'而不是head -2 | tail -1 | nawk '{print $2}'

    使用 Bash 内置测试[(参见man test回答“and” 列表运算符 &&,以及正(==-eq)条件而不是负(!=-ne)条件。

    #!/bin/bash
    while true; do
        sleep 90
        [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') == 'offline' ]] && RestartTomcat.sh
    done
    

但根据评论“运行重新启动后它应该结束”,正确的建议是使用while条件:

#!/bin/bash
while [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') -ne offline ]]
do 
    sleep 90
done
RestartTomcat.sh

或者如果您想使用肯定条件,则until可以按照相同的方式实现循环:

#!/bin/bash
until [[ $(...) -eq offline ]]; do sleep 90; done; RestartTomcat.sh

相关内容