服务启动超时控制
服务启动超时控制
问题描述:
服务有时存在等待很长时间起不来的情况,需要手动kill掉进程,然后再起一遍。
1 使用timeout指定命令运行的超时时间
timeout 30s java -jar while-1.0-SNAPSHOT.jar
脚本
#!/bin/bash
timeout 30s java -jar while-1.0-SNAPSHOT.jar
exit_pid=$? # 不在这里赋值的话,$?的值就会消失
echo "$? $exit_pid" # 这里的$?的值为0
if [[ $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/bash
timeout -s 15 10s java -jar while-1.0-SNAPSHOT.jar
exit_pid=$? # 不在这里赋值的话,$?的值就会消失
echo "$? $exit_pid" # 这里的$?的值为0
if [[ $exit_pid == 124 ]];then
echo "使用exit_pid变量接住退出值,$exit_pid" # 这里使用变量的值就可以正常使用timeout的退出值
fi
注意:下面的使用方式是不会产生作用的
#!/bin/bash
aaa=`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