免责声明
Hello,大家好啊!今天给大家带来一篇关于如何在信创操作系统上实现实时检测服务状态,并在服务未启动时自动启动的文章。通过简单的脚本或系统服务配置,我们可以确保关键服务始终运行,避免因服务意外停止而导致的系统问题。欢迎大家分享点赞,点个在看和关注吧!
为什么需要实时检测服务状态?
在日常运维中,某些关键服务(如数据库、Web 服务等)如果意外停止,可能会影响业务的正常运行。通过实时检测服务状态,并在服务未启动时自动重新启动,可以有效保障系统的稳定性和可靠性。
脚本执行过程
检查 dnsmasq 服务:如果服务未运行,自动重启并记录日志。
检查日志文件大小:如果日志文件超过指定大小,将其压缩归档,并重新生成新的日志文件。
清理过期归档日志:定期删除超过保留天数的旧日志,释放磁盘空间。
脚本适用场景
自动监控和维护关键服务(如 dnsmasq)。
防止日志文件无限增长,避免占用磁盘空间。
保留一定时间的历史日志,满足审计或排障需求。
1
编写脚本
pdsyw@pdsyw-PC:~/Desktop$ sudo vim /usr/local/bin/check_dnsmasq.sh
pdsyw@pdsyw-PC:~/Desktop$ cat /usr/local/bin/check_dnsmasq.sh
# 日志文件路径
LOG_FILE="/var/log/dnsmasq_monitor.log"
# 最大日志文件大小(单位:KB)
MAX_LOG_SIZE=10240 # 10MB
# 日志归档目录(可与主日志路径相同)
ARCHIVE_DIR="/var/log"
# 日志保留天数
LOG_RETENTION_DAYS=7
# 检查 dnsmasq.service 状态
if ! systemctl is-active --quiet dnsmasq.service; then
# 如果服务未运行,尝试重新启动
systemctl restart dnsmasq.service
echo "$(date): dnsmasq.service restarted" >> "$LOG_FILE"
fi
# 检查日志文件大小
if [ -f "$LOG_FILE" ]; then
LOG_SIZE=$(du -k "$LOG_FILE" | cut -f1)
if [ "$LOG_SIZE" -gt "$MAX_LOG_SIZE" ]; then
# 压缩旧日志
ARCHIVE_FILE="${ARCHIVE_DIR}/dnsmasq_monitor-$(date +%Y%m%d%H%M%S).log.gz"
gzip -c "$LOG_FILE" > "$ARCHIVE_FILE"
echo "$(date): Log file size exceeded limit, archived to $ARCHIVE_FILE" > "$LOG_FILE"
fi
fi
# 删除超过保留天数的归档日志
find "$ARCHIVE_DIR" -name "dnsmasq_monitor-*.log.gz" -type f -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;
2
添加可执行权限
pdsyw/Desktop$ sudo chmod +x /usr/local/bin/check_dnsmasq.sh -PC:~
pdsyw/Desktop$ ls -ltr /usr/local/bin/check_dnsmasq.sh -PC:~
3
添加定期执行
pdsyw@pdsyw-PC:~/Desktop$ sudo crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
Choose 1-3 [1]: 1
4
查看crontab内容
pdsyw@pdsyw-PC:~/Desktop$ sudo crontab -l
* * * * * /usr/local/bin/check_dnsmasq.sh
5
测试日志大小限制和压缩
#模拟日志文件达到 10MB
root@pdsyw-PC:~# yes "Test log entry" | head -n 100000 >> /var/log/dnsmasq_monitor.log
#手动运行脚本,查看日志是否被压缩归档
root@pdsyw-PC:~# /usr/local/bin/check_dnsmasq.sh
#检查压缩结果
root@pdsyw-PC:~# ls /var/log/dnsmasq_monitor-*.log.gz
6
测试归档日志清理
#模拟创建过期日志文件
root@pdsyw-PC:~# touch -d "8 days ago" /var/log/dnsmasq_monitor-$(date +%Y%m%d%H%M%S).log.gz
root@pdsyw-PC:~# ls -ltr /var/log/dnsmasq_monitor-20241121170*
root@pdsyw-PC:~# stat /var/log/dnsmasq_monitor-20241121170604.log.gz
root@pdsyw-PC:~# stat /var/log/dnsmasq_monitor-20241121170618.log.gz
#运行脚本后,检查过期日志是否被删除
root@pdsyw-PC:~# /usr/local/bin/check_dnsmasq.sh
root@pdsyw-PC:~# ls -ltr /var/log/dnsmasq_monitor-20241121170*
7
脚本作用详解
1. 监控 dnsmasq.service 状态
if ! systemctl is-active --quiet dnsmasq.service; then
systemctl restart dnsmasq.service
echo "$(date): dnsmasq.service restarted" >> "$LOG_FILE"
fi
作用:检测 dnsmasq.service 服务是否运行。
systemctl is-active --quiet dnsmasq.service:检查服务状态。如果服务未运行,返回非零状态。如果服务未运行,执行 systemctl restart dnsmasq.service 重启服务。每次重启服务都会在日志文件中记录时间戳和操作信息。
2. 检查日志文件大小并归档
if [ "$LOG_SIZE" -gt "$MAX_LOG_SIZE" ]; then
ARCHIVE_FILE="${ARCHIVE_DIR}/dnsmasq_monitor-$(date +%Y%m%d%H%M%S).log.gz"
gzip -c "$LOG_FILE" > "$ARCHIVE_FILE"
echo "$(date): Log file size exceeded limit, archived to $ARCHIVE_FILE" > "$LOG_FILE"
fi
作用:检测日志文件大小是否超过定义的 MAX_LOG_SIZE(默认为 10MB)。
如果超过限制:将日志文件压缩并归档,文件名包含当前时间戳(格式:dnsmasq_monitor-YYYYMMDDHHMMSS.log.gz)。清空原日志文件,同时记录归档操作的时间和路径。
3. 清理过期归档日志
find "$ARCHIVE_DIR" -name "dnsmasq_monitor-*.log.gz" -type f -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;
作用:定期清理超过设定保留天数(默认为 7 天)的压缩归档日志。
使用 find 命令定位归档日志文件,条件:
-name "dnsmasq_monitor-*.log.gz":匹配以 dnsmasq_monitor- 开头且以 .log.gz 结尾的文件。
-mtime +$LOG_RETENTION_DAYS:筛选修改时间在 7 天之前的文件。
-exec rm -f {}:删除符合条件的文件。
4. 日志路径和变量
日志文件路径:
LOG_FILE="/var/log/dnsmasq_monitor.log":存储 dnsmasq.service 状态变化和操作的记录。
归档日志目录:
ARCHIVE_DIR="/var/log":归档日志文件存放目录。
日志大小和保留天数:
MAX_LOG_SIZE=10240:日志文件最大大小,单位为 KB(10MB)。
LOG_RETENTION_DAYS=7:归档日志的保留天数。
通过本文的介绍,大家学会了如何在信创终端操作系统上实时检测服务状态并自动启动。如果您觉得这篇文章对您有帮助,欢迎分享点赞,记得点个在看和关注哦!感谢大家的支持,我们下次再见!
扫码添加
添/加/好/友
进/群/交/流