Bash
1 前言
一个问题,一篇文章,一出故事。
笔者最近有个程序遇到“java: java.io.IOException: Too many open files”错误而服务异常,于是想使用脚本自动修正该服务的问题,于是整理此问。
2 最佳实践
2.1 创建脚本
vim ~/scripts/restartImapiService.sh
加入如下配置,
#!/bin/bash
# 定义服务名称和日志文件路径
serviceName="imapi"
logFile="/var/log/messages"
restartLogFile="/var/log/imapi/${serviceName}ServiceRestart.log"
searchString="java: java.io.IOException: Too many open files"
# 初始化重启标识
restartFlag=0
# 获取最后一条匹配的日志
lastLog=$(grep "$searchString" "$logFile" | tail -n 1)
# 检查是否找到匹配的日志
if [ -n "$lastLog" ]; then
# 检查该日志是否已记录
if ! grep -qF "$lastLog" "$restartLogFile"; then
restartFlag=1 # 因为 Too many open files 错误
fi
fi
# 检查服务状态
serviceStatus=$(systemctl is-active "$serviceName")
if [ "$serviceStatus" != "active" ]; then
restartFlag=2 # 因为服务未运行
fi
# 如果重启标识为0,则退出
if [ "$restartFlag" == 0 ]; then
exit
fi
# 重启服务并记录日志,包含重启标识
echo "$(date '+%Y-%m-%d %H:%M:%S') - Restarting $serviceName service due to error code $restartFlag." >> "$restartLogFile"
systemctl restart "$serviceName"
# 记录匹配的日志
if [ -n "$lastLog" ]; then
echo "$lastLog" >> "$restartLogFile"
fi
exit 0
2.2 测试脚本执行
bash ~/scripts/restartImapiService.sh
2.3 设置计划任务
crontab -e
加入如下设置,
*/5 * * * * bash ~/scripts/restartImapiService.sh
没有评论