服务启动超时控制

问题描述:

服务有时存在等待很长时间起不来的情况,需要手动kill掉进程,然后再起一遍。

1 使用timeout指定命令运行的超时时间

timeout 30s java -jar while-1.0-SNAPSHOT.jar

脚本

#!/bin/bashtimeout 30s java -jar while-1.0-SNAPSHOT.jarexit_pid=$? # 不在这里赋值的话,$?的值就会消失echo "$? $exit_pid" # 这里的$?的值为0if [[ $exit_pid == 124 ]];then  echo "使用exit_pid变量接住退出值,$exit_pid" # 这里使用变量的值就可以正常使用timeout的退出值fi

日期输出是timeout 后面的jar包输出的,while.jar死循环输出当前的系统时间。

最后的test ? = 124是最后的输出

timeout 超过30s的时候,会把后面执行的jar包的进程给杀掉.可以在脚本运行时和运行后分别通过ps查看while进程是否存在。

ps -ef | grep while

2 使用timeout的退出值

timeout 10s java -jar while-1.0-SNAPSHOT.jar 超时退出的状态码 是124

timeout -s 9 10s java -jar while-1.0-SNAPSHOT.jar 超时退出的状态码 是137

timeout -s 15 10s java -jar while-1.0-SNAPSHOT.jar超时退出的状态码 是124,所以默认使用的是kill -15,退出超时的进程。

$? 需要在退出进程之后,立马使用变量接住这个值,否则之后 $? 的值就会消失。

使用$?的退出值

#!/bin/bashtimeout -s 15 10s java -jar while-1.0-SNAPSHOT.jarexit_pid=$? # 不在这里赋值的话,$?的值就会消失echo "$? $exit_pid" # 这里的$?的值为0if [[ $exit_pid == 124 ]];then  echo "使用exit_pid变量接住退出值,$exit_pid" # 这里使用变量的值就可以正常使用timeout的退出值fi

注意:下面的使用方式是不会产生作用的

#!/bin/bashaaa=`timeout -s 15 10s java -jar while-1.0-SNAPSHOT.jar` # 试图用aaa接收timeout的退出值echo "$aaa" # 没有获取到,是空exit_pid=$?echo "$? $exit_pid" # 只有这两个值 0 0,成功返回是0,0表示的echo命令执行成功if [[ $exit_pid == 124 ]];then  echo "使用exit_pid变量接住退出值,$exit_pid"fi

以上脚本经过验证。

本文来自博客园,作者:永恒&,转载请注明原文链接:https://www.cnblogs.com/Sun-yuan/p/17353962.html