当前位置:首页 > Linux > 正文

如何监控linux服务

监控Linux服务可用 systemctl status [服务名]查状态, journalctl -u [服务名]看日志,配合 top/ htop观性能,或用Nagios/Zabbix等工具实现

监控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文件系统可直接读取内核数据:

cat /proc/$(pgrep java)/io | grep read_bytes  # Java应用磁盘读取量

专业监控工具选型指南

Prometheus+Grafana方案(云原生首选)

组件 作用说明 配置要点
Node Exporter 采集系统级指标(CPU/内存/磁盘) 修改/etc/node_exporter/node.yaml
cAdvisor 容器资源监控 对接Docker API
Blackbox Exporter ICMP/HTTP/TCP探针 定义自定义检测规则
Alertmanager 告警路由分发 按严重程度分级通知

部署示例

如何监控linux服务  第1张

# prometheus.yml片段
static_configs:
targets: ['node1:9100','node2:9100']
  labels:
    role: node

Zabbix企业级方案

特色功能 技术实现 适用场景
自动发现 基于SNMP/Agent主动注册资产 大规模物理机群管理
模板继承 预置Linux通用模板+自定义项覆盖 快速标准化监控项
触发器函数 {ITEM_DATA}>{THRESHOLD} → eventid生成 复杂逻辑判断(如连续3次超限)

告警配置示例

<trigger>
    <expression>{memory.usage.data.avgdata[5m]}>90</expression>
    <description>内存使用率持续5分钟高于90%</description>
    <priority>disaster</priority>
</trigger>

Netdata实时监控(零配置优势)

# CentOS安装命令
bash <(curl -Ss https://my-netdata.io/kickstart.sh) --non-interactive

核心优势:开箱即用的火焰图可视化、插件市场支持200+种服务集成、端到端加密传输。


关键场景应对策略

场景1:Java应用频繁GC停顿

诊断路径

  1. 使用jstat -gcutil <PID> 1000观察Full GC频率
  2. 通过jmap -heap <PID>导出堆转储分析对象引用链
  3. 调整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慢查询堆积

优化步骤

  1. 开启慢查询日志:set global slow_query_log=1;
  2. 使用pt-query-digest slow.log生成TOP SQL排行
  3. 添加复合索引: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定时任务中,配合邮件通知即可构建简易

0