插件窝 干货文章 如何通过Systemd和Crontab在Linux系统中自动化服务器监控

如何通过Systemd和Crontab在Linux系统中自动化服务器监控

server 监控 检查 使用率 573    来源:    2025-04-11

通过Systemd和Crontab实现Linux服务器监控自动化

方案概述

在Linux系统中,我们可以结合Systemd和Crontab来实现全面的服务器监控自动化。Systemd适合运行持续性的监控服务,而Crontab则适合定时执行检查任务。以下是具体实现方案:

1. 使用Systemd实现持续监控

1.1 创建监控脚本

首先创建一个监控脚本,例如/usr/local/bin/server_monitor.sh

#!/bin/bash

# 监控CPU、内存、磁盘使用率
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90

# 检查CPU使用率
check_cpu() {
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc -l) )); then
        echo "CPU使用率过高: ${cpu_usage}%" | mail -s "服务器告警" admin@example.com
    fi
}

# 检查内存使用率
check_mem() {
    local mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    if (( $(echo "$mem_usage > $MEM_THRESHOLD" | bc -l) )); then
        echo "内存使用率过高: ${mem_usage}%" | mail -s "服务器告警" admin@example.com
    fi
}

# 检查磁盘使用率
check_disk() {
    df -h | awk -v threshold=$DISK_THRESHOLD '$5+0 > threshold {print "分区 " $1 " 使用率过高: " $5}' | \
    mail -s "磁盘空间告警" admin@example.com
}

# 主循环
while true; do
    check_cpu
    check_mem
    check_disk
    sleep 300  # 每5分钟检查一次
done

给脚本添加执行权限:

chmod +x /usr/local/bin/server_monitor.sh

1.2 创建Systemd服务单元

创建/etc/systemd/system/server-monitor.service文件:

[Unit]
Description=Server Monitoring Service
After=network.target

[Service]
ExecStart=/usr/local/bin/server_monitor.sh
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

1.3 启用并启动服务

systemctl daemon-reload
systemctl enable server-monitor
systemctl start server-monitor

2. 使用Crontab实现定时任务

2.1 创建定期检查脚本

创建/usr/local/bin/daily_server_check.sh

#!/bin/bash

# 每日服务器健康检查
REPORT_FILE="/var/log/server_health_$(date +%Y%m%d).log"

{
    echo "===== 服务器健康检查报告 $(date) ====="
    echo ""
    echo "----- 系统信息 -----"
    uname -a
    echo ""
    echo "----- 内存使用情况 -----"
    free -h
    echo ""
    echo "----- 磁盘使用情况 -----"
    df -h
    echo ""
    echo "----- 最近登录用户 -----"
    last | head -n 10
    echo ""
    echo "----- 运行时间 -----"
    uptime
} > $REPORT_FILE

# 发送报告
mail -s "每日服务器健康报告" admin@example.com < $REPORT_FILE

给脚本添加执行权限:

chmod +x /usr/local/bin/daily_server_check.sh

2.2 添加Crontab任务

编辑root用户的crontab:

crontab -e

添加以下内容:

# 每天凌晨1点执行健康检查
0 1 * * * /usr/local/bin/daily_server_check.sh

# 每周一凌晨2点清理旧日志
0 2 * * 1 find /var/log/server_health_*.log -mtime +30 -exec rm {} \;

3. 高级监控选项

3.1 使用Prometheus和Node Exporter(可选)

对于更专业的监控,可以部署Prometheus和Node Exporter:

# 下载并安装Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz
cd node_exporter-1.3.1.linux-amd64
./node_exporter &

然后创建Systemd服务单元来管理Node Exporter。

3.2 日志轮转配置

创建/etc/logrotate.d/server_monitor

/var/log/server_health_*.log {
    weekly
    missingok
    rotate 4
    compress
    delaycompress
    notifempty
    create 0640 root root
}

4. 验证和测试

  • 检查Systemd服务状态:

    systemctl status server-monitor
    
  • 检查Crontab日志:

    grep CRON /var/log/syslog
    
  • 手动触发测试:

    /usr/local/bin/server_monitor.sh
    /usr/local/bin/daily_server_check.sh
    

5. 安全注意事项

  1. 确保监控脚本和日志文件有适当的权限
  2. 考虑使用专用监控用户而非root
  3. 加密敏感监控数据
  4. 限制对监控端口的访问

通过以上配置,您的Linux服务器将实现全面的自动化监控,包括实时资源监控和定期健康检查报告。