如何监控linux服务
- Linux
- 2025-08-07
- 8
监控Linux服务是保障系统稳定性和可靠性的核心任务之一,以下从核心监控维度、常用工具链、实战操作流程、典型场景解决方案四个层面展开详细说明,并提供可落地的操作示例与配置建议。
核心监控维度拆解
| 监控类型 | 关键指标 | 适用场景 |
|---|---|---|
| 进程状态 | PID存在性、运行状态(Running/Sleeping)、重启次数 | 基础存活性验证 |
| 资源占用 | CPU使用率、内存消耗量、磁盘I/O吞吐量、网络带宽 | 性能瓶颈定位 |
| 日志输出 | 错误日志频率、异常堆栈跟踪、关键业务日志缺失 | 故障根因分析 |
| 端口服务 | 指定端口监听状态、TCP连接数、请求响应延迟 | Web/API服务可用性验证 |
| 依赖关系 | 关联服务的启动顺序、共享资源竞争(如数据库锁表) | 复杂系统级联故障排查 |
| 自动恢复 | 崩溃后自动拉起策略、最大重试次数、故障转移机制 | 高可用架构设计 |
原生命令行工具集详解
systemctl体系
# 实时查看服务状态及最近日志片段 systemctl status nginx --no-pager --lines=20 # 显示完整启动历史(含失败记录) journalctl -u nginx.service --since "5 minutes ago" # 设置开机启动并启用失败自动重启 systemctl enable mysqld && systemctl restart mysqld
️ 注意:systemctl仅能反映Service Unit层面的表象状态,无法捕获子进程异常退出等深层问题。
进程级监控三板斧
| 命令 | 功能描述 | 典型用法示例 |
|---|---|---|
| pgrep -l 'nginx' | 精确匹配进程名+显示PID | 确认主/工作进程均正常运行 |
| lsof -i :80 | 查看指定端口的实际绑定进程 | 排查Nginx未监听端口的特殊场景 |
| strace -p <PID> | 跟踪系统调用轨迹 | 诊断文件句柄泄漏导致的OOM Killer |
资源监控组合技
# 动态刷新资源占用TOP5进程(含线程) watch -n 1 'ps -eo %cpu,%mem,cmd --sort=-%cpu | head -n 6' # 统计指定进程的历史资源峰值 awk '{print $1}' <(ps -o %cpu,comm= -C redis-server --no-headers) | sort -nr | head -1
进阶技巧:结合/proc文件系统可直接读取内核数据:

专业监控工具选型指南
Prometheus+Grafana方案(云原生首选)
| 组件 | 作用说明 | 配置要点 |
|---|---|---|
| Node Exporter | 采集系统级指标(CPU/内存/磁盘) | 修改/etc/node_exporter/node.yaml |
| cAdvisor | 容器资源监控 | 对接Docker API |
| Blackbox Exporter | ICMP/HTTP/TCP探针 | 定义自定义检测规则 |
| Alertmanager | 告警路由分发 | 按严重程度分级通知 |
部署示例:
# prometheus.yml片段 static_configs: targets: ['node1:9100','node2:9100'] labels: role: node
Zabbix企业级方案
| 特色功能 | 技术实现 | 适用场景 |
|---|---|---|
| 自动发现 | 基于SNMP/Agent主动注册资产 | 大规模物理机群管理 |
| 模板继承 | 预置Linux通用模板+自定义项覆盖 | 快速标准化监控项 |
| 触发器函数 | {ITEM_DATA}>{THRESHOLD} → eventid生成 | 复杂逻辑判断(如连续3次超限) |
告警配置示例:

Netdata实时监控(零配置优势)
# CentOS安装命令 bash <(curl -Ss https://my-netdata.io/kickstart.sh) --non-interactive
核心优势:开箱即用的火焰图可视化、插件市场支持200+种服务集成、端到端加密传输。
关键场景应对策略
场景1:Java应用频繁GC停顿
诊断路径:
- 使用jstat -gcutil <PID> 1000观察Full GC频率
- 通过jmap -heap <PID>导出堆转储分析对象引用链
- 调整JVM参数:-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75
监控强化:

# Prometheus JMX Exporter配置 rules: pattern: '<java_pid>' jmx_url: 'service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi'
场景2:MySQL慢查询堆积
优化步骤:
- 开启慢查询日志:set global slow_query_log=1;
- 使用pt-query-digest slow.log生成TOP SQL排行
- 添加复合索引:ALTER TABLE orders ADD INDEX idx_user_date (user_id, create_time);
监控看板必备指标:
- InnoDB缓冲池命中率(Show Global Status Like 'Innodb_buffer_pool_reads%')
- Lock等待时长(SHOW PROCESSLIST;)
- Binlog写入延迟(Seconds_Behind_Master)
自动化运维增强实践
Ansible Playbook示例
name: Ensure Nginx is running and monitored hosts: webservers tasks: name: Start Nginx service service: name: nginx state: started enabled: yes name: Deploy Prometheus exporter copy: src: nginx-prometheus-exporter.tar.gz dest: /opt/ remote_src: no name: Add systemd unit file template: src: exporter.service.j2 dest: /etc/systemd/system/nginx-exporter.service notify: Reload daemon
shell脚本监控模板
#!/bin/bash SERVICE="redis-server" MAX_RETRIES=3 COUNTER=0 while true; do if ! systemctl is-active "$SERVICE" >/dev/null 2>&1; then ((COUNTER++)) echo "$(date) $SERVICE down! Attempting restart..." >> /var/log/service_monitor.log systemctl restart "$SERVICE" || { echo "Restart failed!"; exit 1; } sleep 5 else COUNTER=0 fi [ $COUNTER -ge $MAX_RETRIES ] && { echo "Max retries reached!"; exit 1; } sleep 60 done
相关问答FAQs
Q1: 为什么有时systemctl显示服务正在运行,但实际功能不可用?
A: 这是典型的”僵尸进程”现象,可能原因包括:①主进程已崩溃但子进程仍在运行;②服务挂起在初始化阶段未完成;③配置文件变更未生效,建议执行systemctl reset-state <service>强制重置状态,并检查journalctl -xe获取完整启动日志。
Q2: 如何在不安装额外软件的情况下实现简单的服务健康检查?
A: 可采用以下组合方案:①nc -zv <port>检测端口可达性;②curl --silent --head http://localhost/health验证HTTP端点;③pgrep -c <process>统计进程数量,将这些命令整合到crontab定时任务中,配合邮件通知即可构建简易