Bash 3环境下替代timeout实现日志监控超时退出方案求助
Bash 3兼容的服务启动状态超时检测方案
原代码报错原因
- 进程替换语法
<()仅在高版本Bash默认支持,Bash 3环境未启用该特性,直接调用会触发语法错误 - 自行实现的超时逻辑存在两处语法问题:用反引号包裹
grep命令会将执行结果作为指令传入exec运行,同时未处理tail子进程和监控主进程的关联关系,导致匹配成功无法正常退出、kill调用格式报错
可行实现代码
完全兼容Bash 3,无需额外工具和root权限,逻辑和原timeout版本完全一致:
LOG_FILE="AdminServer.out" TARGET_PATTERN="Server state changed to RUNNING" TIMEOUT_SEC=300 # 启动后台监控任务:tail实时读日志,匹配到目标后grep自动退出 tail -f "$LOG_FILE" | grep -q "$TARGET_PATTERN" & MONITOR_PID=$! # 超时检测循环 wait_sec=0 while [ $wait_sec -lt $TIMEOUT_SEC ]; do # 监控进程已退出 = 匹配到目标日志 if ! kill -0 $MONITOR_PID 2>/dev/null; then printf "\n===> server came to RUNNING state\n" # 清理残留的tail子进程 kill $(ps -o pid= --ppid $MONITOR_PID) 2>/dev/null exit 0 fi sleep 1 wait_sec=$((wait_sec + 1)) done # 超时逻辑:清理所有后台进程后抛出错误 kill $(ps -o pid= --ppid $MONITOR_PID) $MONITOR_PID 2>/dev/null printf "\n===> unable to bring up the server.please check\n" exit 1
可选优化
如果服务运行过程中存在日志滚动切割场景,可以将tail -f替换为tail -F,避免日志滚动后监控失效。
内容的提问来源于stack exchange,提问作者kaushal47
相关产品推荐
相关产品推荐

