51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在Linux系统中,如何监控一个关键服务(如船舶动力系统监控服务)的CPU和内存使用情况,并设置告警阈值?请描述具体命令和配置方法。

CSSC 中国船舶集团华南船机有限公司计算机系统员难度:中等

答案

1) 【一句话结论】

在Linux中,可通过top/htop实时查看服务CPU、内存占用,结合watch定时刷新或cron/systemd timer周期执行脚本检查阈值,超过时通过邮件/消息队列触发告警,核心是工具监控+阈值判断+告警触发。

2) 【原理/概念讲解】

老师口吻:Linux系统通过/proc文件系统存储进程资源信息,监控工具读取该文件系统获取CPU、内存占用数据。

  • top/htop:实时交互式工具,top按CPU/内存排序进程,htop更直观(支持进程树);
  • watch:循环执行命令并定时刷新输出(如每2秒刷新一次);
  • cron:按时间表(分、时、日、月、年)执行任务,适合长期周期性检查;
  • systemd timer:更灵活的定时任务,支持复杂周期(如按工作日、特定时间),依赖关系管理更强大。

类比:top像汽车仪表盘,实时显示转速(CPU)和油量(内存);watch像定时刷新的仪表盘;cron是按时间表(如每天凌晨)检查油量;systemd timer是更智能的定时器,可设置复杂周期。

3) 【对比与适用场景】

工具定义特性使用场景注意点
top实时进程资源监控工具交互式,按CPU/内存排序短期实时监控(如快速查看异常)需手动刷新,不适合长期告警
htop图形化进程监控工具直观(进程树、颜色标记)需X11环境,实时监控需图形界面,复杂系统可能卡顿
watch命令循环执行工具定时刷新命令输出(间隔固定)定期检查系统状态(如内存、磁盘)间隔时间固定,需手动设置
cron定时任务调度器按时间表(分、时、日、月、年)执行长期周期性任务(如每日备份)需编写crontab文件,权限管理
systemd timersystemd的定时任务支持复杂周期(如按工作日、特定时间)灵活周期性任务(如每5分钟检查服务)需编写timer单元文件,依赖管理

4) 【示例】

假设船舶动力系统监控服务进程ID为1234,监控CPU/内存并设置告警(以邮件告警为例):

  1. 实时查看进程资源:

    top -H -p 1234  # -H显示线程,-p指定进程ID
    
  2. 定时检查内存(每60秒刷新):

    watch -n 60 free -m  # 查看内存使用情况
    
  3. 告警脚本(monitor.sh):

    #!/bin/bash
    PID=1234
    THRESHOLD_CPU=80  # CPU阈值(%)
    THRESHOLD_MEM=80  # 内存阈值(%)
    
    while true; do
        CPU=$(top -bn1 | grep "$PID" | awk '{print $9}')
        MEM=$(ps -p $PID -o %mem|grep -v %mem|head -n1)
        
        if (( $(echo "$CPU > $THRESHOLD_CPU" | bc -l) )) || (( $(echo "$MEM > $THRESHOLD_MEM" | bc -l) )); then
            echo "告警:服务PID=$PID CPU=$CPU% 内存=$MEM%" | mail -s "船舶动力系统监控告警" admin@example.com
        fi
        sleep 60  # 每分钟检查一次
    done
    
  4. 配置定时任务(cron或systemd timer):

    • cron方式:编辑crontab文件,添加任务:
      * * * * * /path/to/monitor.sh  # 每分钟执行脚本
      
    • systemd timer方式:
      • 创建timer单元文件monitor.timer:
        [Unit]
        Description=Monitor service CPU and Memory
        
        [Timer]
        OnCalendar=*:0/5  # 每5分钟执行一次
        Persistent=true
        
        [Install]
        WantedBy=timers.target
        
      • 创建服务单元文件monitor.service:
        [Unit]
        Description=Service monitor script
        Wants=monitor.timer
        
        [Service]
        Type=oneshot
        ExecStart=/path/to/monitor.sh
        RemainAfterExit=yes
        
      • 启用并启动timer:
        systemctl enable --now monitor.timer
        

5) 【面试口播版答案】

在Linux中,监控关键服务CPU和内存并设置告警,核心是用top/htop实时查看,结合watch定时刷新,或通过cron/systemd timer周期执行脚本。比如用top -H -p <服务PID>实时看CPU、内存,用watch -n 2 free -m定期检查内存。告警方面,写一个shell脚本,比如检查服务进程的CPU是否超过80%,内存是否超过80%,超过时发送邮件。脚本内容是循环执行,每分钟检查一次,如果超过阈值就调用mail发送告警。配置上,可以用cron设置每分钟执行脚本,或者用systemd timer更灵活,比如每5分钟执行一次,通过systemctl启用。这样就能实时监控并触发告警。

6) 【追问清单】

  • 问:如何确保监控脚本不会误报?
    回答要点:通过过滤进程名称(如检查进程名是否为“船舶动力系统监控服务”),避免其他进程干扰;设置阈值时考虑系统负载,比如在低负载时调整阈值。
  • 问:如果服务重启,监控脚本如何处理?
    回答要点:脚本中检查进程是否存在,如果不存在则重新启动服务(假设有启动脚本),或者记录日志并通知管理员。
  • 问:除了邮件告警,还有哪些告警方式?
    回答要点:可以使用消息队列(如Redis发布订阅),或集成到监控平台(如Zabbix、Prometheus),通过Web界面或短信通知。
  • 问:如何优化监控的实时性?
    回答要点:使用htop代替top,更直观;或用ps aux | grep 服务名 | awk '{print $3,$4}'快速查看CPU、内存,减少命令执行时间。
  • 问:在船舶动力系统这种高可用场景,监控是否需要考虑容错?
    回答要点:监控脚本应部署在多个节点,避免单点故障;告警系统需冗余,比如邮件服务器和消息队列同时告警,确保信息不丢失。

7) 【常见坑/雷区】

  • 坑1:进程ID识别错误:直接用top查看时,进程ID可能被替换,导致监控错误。解决:通过进程名称或命令行参数(如“-p <进程名>”)准确识别。
  • 坑2:cron任务设置过频:时间间隔过短导致系统负载过高。解决:根据需求调整间隔(如每5分钟或每小时),避免频繁执行。
  • 坑3:服务重启后监控失效:脚本未处理进程状态,导致监控中断。解决:在脚本中检查进程是否存在,若不存在则调用启动脚本,并记录日志。
  • 坑4:阈值设置不合理:在系统负载高时设置过低,导致误报。解决:根据系统历史数据调整阈值,或使用动态阈值(结合系统负载计算)。
  • 坑5:权限问题:脚本无法读取进程信息。解决:确保脚本以root或指定用户(如监控用户)运行,并设置适当权限(如chmod +x,sudo执行)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1