运维日记2025/11/25

45 阅读3分钟

日期:2025/11/25 学习主题:创建Linux系统服务监控脚本


📌 今日目标

学习使用Python监控Linux系统服务的运行状态,创建一个能自动检查Nginx、MySQL、SSH等关键服务是否正常的工具脚本。


🔧 使用的技术与工具

  • 操作系统:WSL (Ubuntu)
  • 编程语言:Python 3
  • 关键命令systemctl is-active
  • 编辑器:micro
  • 版本控制:Git

📝 代码实现过程

1. 核心功能函数:check_service()

python

def check_service(service_name):
    try:
        result = subprocess.run(
            ['systemctl', 'is-active', service_name], 
            capture_output=True, 
            text=True, 
            check=True
        )
        return result.stdout.strip() == 'active'
    except subprocess.CalledProcessError:
        return False

我学到的知识点

  • subprocess.run() 可以让Python执行系统命令
  • systemctl is-active 是检查服务状态的标准命令
  • capture_output=True 能捕获命令输出结果
  • 异常处理很重要,服务不存在时返回False而不是让程序崩溃

2. 服务列表配置

python

SERVICES_TO_MONITOR = ['nginx', 'mysql', 'ssh', 'cron']

设计思路:使用常量列表定义要监控的服务,方便后续添加或修改。

3. 主监控逻辑

python

problematic_services = []
for service in SERVICES_TO_MONITOR:
    is_running = check_service(service)
    status = "✅ 运行中" if is_running else "❌ 已停止"
    print(f"{service:15} {status}")
    
    if not is_running:
        problematic_services.append(service)

编程技巧

  • 使用列表收集问题服务,便于后续处理
  • 字符串格式化 ({service:15}) 让输出对齐更美观
  • 三元运算符让代码更简洁

🎯 实际运行结果

text

🔍 服务状态检查报告
========================================
nginx           ✅ 运行中
mysql           ❌ 已停止
ssh             ✅ 运行中
cron            ✅ 运行中

⚠️  发现 1 个服务异常: mysql

发现的问题:MySQL服务没有运行,需要手动启动。


💡 收获与心得

  1. 自动化思维:手动检查服务状态很繁琐,用脚本自动化后效率大大提升
  2. Python与系统交互:学会了如何在Python中执行Linux命令并处理结果
  3. 实用价值:这个脚本可以在服务器维护中实际使用,监控关键服务
  4. 错误处理:意识到生产环境脚本必须有良好的异常处理机制

🚀 下一步计划

  • 添加自动重启故障服务的功能
  • 设置定时任务,让脚本自动定期运行
  • 添加邮件或短信告警功能
  • 学习使用 systemctl restart 命令实现自动修复

📚 总结

今天成功创建了第一个有实用价值的运维脚本。从理论学习到实际编码,最终完成了一个能真实监控系统服务的工具。这让我对Python在运维工作中的实际应用有了更深刻的理解。


  • 日期:2025/11/25

  • 我发现:Cron定时任务需要使用绝对路径

  • 问题:为什么在终端能运行的python3在Cron中就不行?

  • 原因:Cron的环境变量PATH非常有限,找不到python3命令

  • 解决方案:使用绝对路径/usr/bin/python3

  • 学到的知识点

    1. Linux命令可以通过whichwhereis查找完整路径
    2. 不同的执行环境可能有不同的环境变量设置
    3. 在自动化任务中,使用绝对路径更可靠