zabbix信息收集
一般zabbix信息收集都是写成脚本
思路:将监控的信息写成函数,使用位置参数$1来调用函数即可,一般都是zabbix来传参
1.tcp信息收集
tcp三次握手
一般由客户端发起请求
1.首先客户端向服务器发起请求,给服务器发送一个SYN的请求包
2.服务器接收确认后给客户端回复一个ACK的确认包,在向客户端发起一个SYN的包,表示请求和客户端建立连接
3.客户端收到sync的包后会回复一个ACK的确认包,表示与服务器建立连接,三次握手结束
tcp四次挥手
通常由服务器发起,例如把用户请求的数据都给用户后就断开了连接
不同的应用会有不同的关闭,例如ssh就是客户端发起
1.服务器端向客户端发送一个FIN的包,表示要断开连接
2.客户端收到FIN包后,确认无误就会回复一个ACK的包
3.既然服务器端以及断开了连接,那么客户端也要断开连接,客户端向服务器发送FIN的包
4.服务器收到FIN包后回复一个ACK的包,四次握手完成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4rkD7001-1592060494794)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200329154648099.png)]
SYN、FIN、ACk这些我们都是看不到,我们能看到的只有Listen、ESTABLSHED、CLOSE WAIT 、TIME_WAIT、CLOSED,如果看到了SYN、FIN、ACK这些状态,那么就说明问题来了
下面开始编写脚本
这种方式一般是给人看的,所有状态的信息 [root@localhost d18_ph_zabbix_sjxx]# netstat -an | grep 'tcp' | awk '{status[$NF]++} END{for (i in status){print i,status[i]}}' LISTEN 13 ESTABLISHED 2 [root@localhost d18_ph_zabbix_sjxx]# ss -an | grep 'tcp' | awk '{status[$2]++} END{for (i in status){print i,status[i]}}' LISTEN 13 ESTAB 2 我们是要给zabbix看的,所以我们要把每一个状态的统计命令写出来 #!/bin/bash #zabbix收集tcp连接状态,ss版 LISTEN() { #ss 版本 #ss -an | grep 'tcp' | grep 'LISTEN' | wc -l #netstat 版本 netstat -an | grep 'tcp' | grep 'LISTEN' | wc -l } SYN_RECV() { #ss 版本 #ss -an | grep 'tcp' | grep 'SYN[-_]RECV' | wc -l #netstat 版本 netstat -an | grep 'tcp' | grep 'SYN[-_]RECV' | wc -l } ESTABLISHED() { #ss 版本 #ss -an | grep 'tcp' | grep 'ESTAB' | wc -l #netstat 版本 netstat -an | grep 'tcp' | grep 'ESTABLISHED' | wc -l } TIME_WAIT() { #ss 版本 #ss -an | grep 'tcp' | grep 'TIME[-_]WAIT' | wc -l #netstat 版本 netstat -an | grep 'tcp' | grep 'TIME[-_]WAIT' | wc -l } $1 这里使用$1其实类似于传参,例如$1输入的是LISTEN那么就会调用对应的LISTEN函数 执行: [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_tcp_connect_status.sh LISTEN 13 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_tcp_connect_status.sh ESTABLISHED 2
2.mysql信息收集
mysqladmin命令除了可以改密码,还有很多扩展的功能
看一些mysql的基本信息 [root@localhost d18_ph_zabbix_sjxx]# mysqladmin status Uptime: 263313 Threads: 1 Questions: 3 Slow queries: 0 Opens: 0 Flush tables: 2 Open tables: 26 Queries per second avg: 0.000 如果数据库设置了密码则这样使用 [root@localhost ~]# mysqladmin -uroot -p123 status Uptime: 39713 Threads: 1 Questions: 2 Slow queries: 0 Opens: 0 Flush tables: 2 Open tables: 26 Queries per second avg: 0.000 看mysql扩展信息,例如增删改查的数量,由于输出过多,因此我们只保留几个比较重要的 [root@localhost d18_ph_zabbix_sjxx]# mysqladmin extended-status +------------------------------------------+-------------+ | Variable_name | Value | +------------------------------------------+-------------+ | Com_commit | 0 | | Com_insert | 0 | | Com_delete | 0 | | Com_update | 0 | | Com_select | 0 | | Com_rollback | 0 | +------------------------------------------+-------------+
脚本内容
#!/bin/bash #监控mysql的状态信息 #当前的uptime时间 Uptime() { mysqladmin status | awk '{print $2}' } #慢查询的数量 Slow_queries() { mysqladmin status | awk '{print $9}' } #insert的数量 Com_insert() { mysqladmin extended-status | awk '/\<Com_insert\>/{print $4}' } #delete的数量 Com_delete() { mysqladmin extended-status | awk '/\<Com_delete\>/{print $4}' } #update的数量 Com_update() { mysqladmin extended-status | awk '/\<Com_update\>/{print $4}' } #select的数量 Com_select() { mysqladmin extended-status | awk '/\<Com_select\>/{print $4}' } #commit(提交)的数量 Com_commit() { mysqladmin extended-status | awk '/\<Com_commit\>/{print $4}' } #rollback(回滚)的数量 Com_rollback() { mysqladmin extended-status | awk '/\<Com_rollback\>/{print $4}' } $1 执行 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Uptime 264790 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Slow_queries 0 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Com_insert 0 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Com_delete 0 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Com_update 0 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Com_select 1 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Com_commit 0 [root@localhost d18_ph_zabbix_sjxx]# ./zabbix_mysql_status.sh Com_rollback 0
3.内存信息收集
每当vim一个文件,都会从硬盘把数据读取到内存页page,如果要写一个文件,可能一个page页不够,要分好几个,这就形成了脏页,如果不保存,就会形成丢失文件,因为只是在内存中修改了,我们需要持久化到硬盘才可以
cp一个文件的时候首先拷到内存页,在拷贝到另一个内存页,最后再将这些内存页保存到硬盘中,同样会产生脏页
命令结束了不代表数据一定到了硬盘,只能说到内存上去了,因为磁盘写入默认使用异步方式,可以使用sync命令,把脏页写入到硬盘,常用于u盘,硬盘的话可以慢慢写
脚本内容
#!/bin/bash #内存信息收集 #内存总量 MemTotal() { awk '/^MemTotal/{print $2}' /proc/meminfo } #空闲的内存量 MemFree() { awk '/^MemFree/{print $2}' /proc/meminfo } #缓冲区的大小 Buffers() { awk '/^Buffers/{print $2}' /proc/meminfo } #缓存区大小 Cached(){ awk '/^Cached/{print $2}' /proc/meminfo } #脏页的大小 Dirty() { awk '/^Dirty/{print $2}' /proc/meminfo } $1