进程数量监控(通过 proc.num):
# 监控所有名为 "nginx" 的进程
proc.num[nginx]
# 监控特定用户的进程
proc.num[nginx,,www-data]
# 监控指定命令参数的进程
proc.num[,,,mysql]
# 监控特定进程ID文件
proc.num[,,,pid,/var/run/nginx.pid]
在 Zabbix Agent 配置文件中添加(zabbix_agentd.conf):
# 启用进程监控
EnableRemoteCommands=1
# 自定义监控项(可选)
UserParameter=process.check[*],ps aux | grep -v grep | grep $1 | wc -l
在 Zabbix Web 界面配置:
创建监控项:
proc.num[nginx]配置触发器:
# 当进程数为0时触发告警
{Template OS Linux:proc.num[nginx].last()}=0
# 进程数超过阈值
{Template OS Linux:proc.num[nginx].min(5m)}>50
# 监控TCP端口
net.tcp.listen[80]
net.tcp.listen[3306]
# 监控UDP端口
net.udp.listen[53]
# 指定IP地址监控
net.tcp.listen[127.0.0.1,80]
创建监控脚本 /etc/zabbix/scripts/check_port.sh:
#!/bin/bash
PORT=$1
TIMEOUT=3
# 检查端口是否监听
nc -z -w $TIMEOUT 127.0.0.1 $PORT > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 1
else
echo 0
fi
配置 UserParameter:
UserParameter=port.status[*],/etc/zabbix/scripts/check_port.sh $1
UserParameter=tcp.port[*],ss -tln | grep :$1 | wc -l
UserParameter=port.process[*],netstat -tlnp | grep :$1 | awk '{print $7}' | cut -d'/' -f1
/etc/zabbix/zabbix_agentd.d/process_port.conf:
# 进程监控
UserParameter=service.status[*],systemctl is-active $1
UserParameter=process.count[*],pgrep -c $1
# 端口监控
UserParameter=port.listen[*],netstat -tln | grep ":$1 " | wc -l
UserParameter=port.tcp.status[*],timeout 2 bash -c "echo > /dev/tcp/127.0.0.1/$1" && echo 1 || echo 0
# 获取进程详细信息
UserParameter=process.info[*],ps aux | grep $1 | grep -v grep | head -1
创建模板包含以下监控项:
进程监控项:
| 名称 | 键值 | 触发器条件 |
|------|------|------------|
| Nginx进程数 | proc.num[nginx] | {last()}=0 |
| MySQL进程状态 | proc.num[mysqld] | {last()}=0 |
| Java应用进程 | proc.num[java] | {max(5m)}>100 |
端口监控项:
| 名称 | 键值 | 触发器条件 |
|------|------|------------|
| SSH端口 | net.tcp.listen[22] | {last()}=0 |
| HTTP端口 | net.tcp.listen[80] | {last()}=0 |
| 数据库端口 | net.tcp.listen[3306] | {last()}=0 |
创建发现规则:
{
"data": [
{
"{#PROCNAME}": "nginx",
"{#USER}": "www-data"
},
{
"{#PROCNAME}": "mysql",
"{#USER}": "mysql"
}
]
}
/etc/zabbix/scripts/discover_ports.sh:
#!/bin/bash
echo '{"data":['
# 获取监听端口
netstat -tln | grep 'LISTEN' | awk '{print $4}' | cut -d':' -f2 | sort -nu | while read port
do
echo -n '{"{#PORT}":"'$port'"},'
done | sed 's/,$//'
echo ']}'
对应的 UserParameter:
UserParameter=discover.ports,/etc/zabbix/scripts/discover_ports.sh
# 监控进程CPU使用率
UserParameter=process.cpu[*],ps aux | grep $1 | grep -v grep | awk '{print $3}' | head -1
# 监控进程内存使用
UserParameter=process.mem[*],ps aux | grep $1 | grep -v grep | awk '{print $4}' | head -1
# 监控服务及其依赖端口
UserParameter=service.health[*],/etc/zabbix/scripts/service_health.sh $1
# 在Agent端测试
zabbix_agentd -t "proc.num[nginx]"
zabbix_agentd -t "net.tcp.listen[80]"
# 从Server端测试
zabbix_get -s 客户端IP -k "proc.num[nginx]"
# 在agent配置中开启调试
DebugLevel=4
LogFile=/var/log/zabbix/zabbix_agentd.log
权限管理:
性能优化:
告警策略:
安全考虑:
这样的配置可以实现对进程和端口的全面监控,并能及时发现问题并告警。