监控 CentOS 中 extract 的实用方案
一、先明确监控对象
- 若“extract”指解压命令(如 tar、unzip、gzip 等),重点监控:解压进度、吞吐速率、CPU/内存、磁盘 I/O、是否异常退出。
- 若“extract”是某个自定义程序/脚本/服务,重点监控:进程存活、资源占用、日志输出、返回码与告警。
二、解压过程的实时监控
- 进度与速率
- 使用 pv 观察管道流量(安装:sudo yum install pv):
- 示例:tar -xzvf file.tar.gz | pv > /dev/null
- 使用 tar 内置进度:–checkpoint 与 --checkpoint-action
- 示例:tar --checkpoint=1000 --checkpoint-action=dot file.tar.gz
- 资源与 I/O
- 实时资源:top/htop(安装:sudo yum install htop)
- 内存:free -h
- 系统概览:vmstat 1
- 磁盘 I/O:iostat -x 1(安装:sudo yum install sysstat)
- 进程级 I/O:iotop(安装:sudo yum install iotop)
- 进程级 CPU/内存:pidstat -p [PID] 1(需 sysstat)
- 故障排查与系统线索
- 进程与日志:ps aux | grep extract;journalctl -xe;必要时用 strace -e trace=file 跟踪文件操作(sudo yum install strace)
- 空间与连接:df -h;ss -tuln;ping/traceroute 做连通性验证
三、将 extract 纳入持续监控与告警
- 作为 systemd 服务托管
- 示例单元 extract.service:
- [Unit] Description=Extract Job
- [Service] Type=simple ExecStart=/usr/local/bin/do_extract.sh
- [Install] WantedBy=multi-user.target
- 常用命令:
- 启动/查看:systemctl start|status extract.service
- 实时日志:journalctl -u extract.service -f
- 企业级监控
- Zabbix:通过 UserParameter 采集自定义指标(如解压耗时、返回码、速率),可做阈值与告警
- Prometheus:以脚本 Exporter 或 Pushgateway 上报指标,Grafana 可视化与告警
- Nagios:编写 check 脚本(检查进程存活、返回码、日志关键字),接入告警通道
四、可直接使用的监控脚本模板
- 功能:执行解压、记录开始/结束时间、返回码、最大内存、平均 CPU、退出状态;适配 tar.gz/zip。
- 保存为:/usr/local/bin/do_extract.sh(chmod +x)
- 使用:/usr/local/bin/do_extract.sh /data/file.tar.gz /data/out
#!/usr/bin/env bash
set -Eeuo pipefail
IN="$1"
OUT="${2:-./}"
LOG="/var/log/extract_$(date +%F_%H-%M-%S).log"
T0=$(date +%s)
TYPE=0
[[ "$IN" =~ \.zip$ ]] && TYPE=1
cleanup() {
local rv=$?
local dur=$(( $(date +%s) - T0 ))
local maxrss_kb=0
local avgcpu_pct=0
if [[ -n "${PID:-}" ]]; then
maxrss_kb=$(ps -o rss= -p "$PID" | awk '{m=$1>m?$1:m} END{print m}')
avgcpu_pct=$(ps -o %cpu= -p "$PID" | awk '{s+=$1} END{printf "%.1f", s/NR}')
fi
{
echo "start_time=$T0"
echo "end_time=$(date +%s)"
echo "duration_sec=$dur"
echo "exit_code=$rv"
echo "max_rss_kb=${maxrss_kb:-0}"
echo "avg_cpu_pct=${avgcpu_pct:-0}"
echo "input=$IN"
echo "output=$OUT"
} >> "$LOG"
exit "$rv"
}
trap cleanup EXIT
mkdir -p "$OUT"
case "$TYPE" in
0)
tar -xzvf "$IN" -C "$OUT"
;;
1)
unzip -q "$IN" -d "$OUT"
;;
*)
echo "Unsupported file: $IN" >&2
exit 2
;;
esac
- 接入 systemd(/etc/systemd/system/extract.service):
- ExecStart=/usr/local/bin/do_extract.sh /data/file.tar.gz /data/out
- StandardOutput=journal
- StandardError=journal
- 接入 Zabbix(示例 UserParameter,需先在 agent 配置并重启):
- UserParameter=extract.status[], grep -oP ‘exit_code=\K\d+’ "/var/log/extract_.log" | tail -1
- UserParameter=extract.duration[], grep -oP ‘duration_sec=\K\d+’ "/var/log/extract_.log" | tail -1
- 在 Zabbix 创建监控项与触发器(如 exit_code != 0 或 duration 超过阈值)