虽然zabbix自带了监控端口和进程的监控项,但是有时候无法满足我们的定制化端口和进程需求,所以我们需要自己编写脚本来进行定制化监控端口和进程
1. 编写Zabbix监控端口和进程脚本
#!/bin/bash
#function:monitor linux port status from zabbix
#mail:zck91@163.com
#version date:2024-03-06
linux.proc.discovery(){
proc=($(cat /etc/zabbix/scripts/proc.txt | grep -v "^#" | awk '{print $1}'))
proc_num=($(cat /etc/zabbix/scripts/proc.txt | grep -v "^#" | awk '{print $2}'))
printf '{\n'
printf '\t"data":[\n'
for ((i=0;i<${#proc[@]};++i))
{
num=$(echo $((${#proc[@]}-1)))
if [ "$i" != ${num} ];
then
printf "\t\t{ \n"
printf "\t\t\t\"{#PROCNAME}\":\"${proc[$i]}\",\n"
printf "\t\t\t\"{#PROC_NUM}\":\"${proc_num[$i]}\"},\n"
else
printf "\t\t{ \n"
printf "\t\t\t\"{#PROCNAME}\":\"${proc[$num]}\",\n"
printf "\t\t\t\"{#PROC_NUM}\":\"${proc_num[$num]}\"}]}\n"
fi
}
}
linux.port.discovery(){
host=($(cat /etc/zabbix/scripts/port.txt | grep -v "^#" | awk '{print $1}'))
port=($(cat /etc/zabbix/scripts/port.txt | grep -v "^#" | awk '{print $2}'))
printf '{\n'
printf '\t"data":[\n'
for ((i=0;i<${#host[@]};++i))
{
num=$(echo $((${#host[@]}-1)))
if [ "$i" != ${num} ];
then
printf "\t\t{ \n"
printf "\t\t\t\"{#HOST}\":\"${host[$i]}\",\n"
printf "\t\t\t\"{#PORT}\":\"${port[$i]}\"},\n"
else
printf "\t\t{ \n"
printf "\t\t\t\"{#HOST}\":\"${host[$num]}\",\n"
printf "\t\t\t\"{#PORT}\":\"${port[$num]}\"}]}\n"
fi
}
}
case $1 in
port_discovery)
linux.port.discovery
;;
proc_discovery)
linux.proc.discovery
;;
tcp_connect_total)
netstat -tunlpa | awk '{print $4}' | grep ":$2$" | wc -l
;;
tcp_connect_established)
netstat -tunlpa | grep ESTABLISHED | awk '{print $4}' | grep ":$2$" | wc -l
;;
tcp_connect_close_wait)
netstat -tunlpa | grep CLOSE_WAIT | awk '{print $4}' | grep ":$2$" | wc -l
;;
tcp_connect_time_wait)
netstat -tunlpa | grep TIME_WAIT | awk '{print $4}' | grep ":$2$" | wc -l
;;
proc_num)
ps aux | grep $2 | grep -v grep | grep -v $0 | wc -l
;;
proc_mem_util)
ps aux | grep $2 | grep -v grep | awk '{sum+=$4};END{print sum}'
;;
proc_cpu_util)
ps aux | grep $2 | grep -v grep | awk '{sum+=$3};END{print sum}'
;;
*)
echo "bash $1 {port_discovery,tcp_connect_total,proc_discovery,tcp_connect_established,tcp_connect_close_wait,proc_num,proc_cpu_util,proc_mem_util}"
;;
esac
2. port and process txt文件
- port.txt
#第一列:探测ip,如果本地端口就用127.0.0.1,外部端口则写真实的外部端口
#第二列:端口号
#例如需要监控本地的3306端口,则可以按照下面方式填写(真实情况需要把#去掉,这里是避免监控到了)
## 127.0.0.1 3306
- proc.txt
#第一列:进程名称
#第二列:进程个数
#例如需要监控本地的nginx,则可以按照下面方式填写(真实情况需要把#去掉,这里是避免监控到了)
## nginx 3
3. Conf配置文件
UserParameter=port.discovery,bash /etc/zabbix/scripts/monitor_tcp.sh port_discovery
UserParameter=proc.discovery,bash /etc/zabbix/scripts/monitor_tcp.sh proc_discovery
UserParameter=tcp_connect_total[*],bash /etc/zabbix/scripts/monitor_tcp.sh tcp_connect_total $1
UserParameter=tcp_connect_established[*],bash /etc/zabbix/scripts/monitor_tcp.sh tcp_connect_established $1
UserParameter=tcp_connect_close_wait[*],bash /etc/zabbix/scripts/monitor_tcp.sh tcp_connect_close_wait $1
UserParameter=tcp_connect_time_wait[*],bash /etc/zabbix/scripts/monitor_tcp.sh tcp_connect_time_wait $1
UserParameter=proc_num[*],bash /etc/zabbix/scripts/monitor_tcp.sh proc_num $1
UserParameter=proc_cpu_util[*],bash /etc/zabbix/scripts/monitor_tcp.sh proc_cpu_util $1
UserParameter=proc_mem_util[*],bash /etc/zabbix/scripts/monitor_tcp.sh proc_mem_util $1
4. 监控模板
https://github.com/chuckzeng/chuck-zabbix/blob/master/zabbix-port-process/%E7%9B%91%E6%8E%A7%E6%A8%A1%E6%9D%BF/port_and_process_discovery.xml