Bash脚本循环搜索日志问题及脚本可行性咨询
Bash脚本问题解答
需求说明
- 编写Bash脚本,持续在应用服务器日志文件中搜索特定字符串
request completed - 若1分钟内未检测到该字符串,立即停止应用
现有脚本
timeout 600 tail -f /path/to/log/file | grep -q "request completed" if [ $? -eq 0 ]; then echo "'request completed' found. Starting search again" while true; do timeout 600 tail -f /path/to/log/file | grep -q "request completed" if [ $? -ne 0 ]; then break fi done else stop the application command fi
问题解答
1. 若在脚本第5行之后仍找到该字符串,脚本会重新搜索还是退出?
脚本第5行是while true; do循环的起始,循环内的timeout 600 tail -f ... | grep -q ...如果成功匹配到request completed,$?会返回0,此时if [ $? -ne 0 ]的条件不成立,不会执行break,循环会重新执行——也就是脚本会重新开始搜索。
2. 当前脚本能否实现需求?
不能实现需求,存在以下关键问题:
- 超时时间不符合要求:脚本中使用
timeout 600(10分钟),但需求是1分钟未检测到字符串就停止应用,应该改为timeout 60 - 停止应用的逻辑不完整:仅在初始检测超时(第一个
timeout未找到字符串)时才执行停止命令;但循环内检测到超时(未找到字符串)时,只会退出循环,不会触发停止应用的操作 - 逻辑冗余:开头的单独检测和后续循环功能重复,没有必要
- 潜在进程泄漏:
grep -q匹配到字符串后会立即退出,此时管道另一端的tail -f可能仍在后台运行,变成僵尸进程
内容的提问来源于stack exchange,提问作者user22350706
相关产品推荐
相关产品推荐

