当前位置:   article > 正文

/proc/net/tcp

/proc/net/tcp

http://blog.csdn.net/zzz_781111/article/details/7976219

nagios自带的check_antp太过简约,除了状态统计输出外,什么参数都不提供。在面对不同应用服务器时,报警就成了很大问题。于是决定自己写一个check脚本。作脚本运行,与命令操作时一个不同,就是要考虑一下效率问题。在高并发的机器上定期运行netstat -ant命令去统计,显然不太合适,可以直接从proc系统中取数据,这就快多了。

先介绍/proc/net/tcp文件,这里记录的是ipv4下所有tcp连接的情况,包括下列数值:

  1. sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  2. 0: 00000000:3241 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 22714864 1 ffff88004f918740 750 0 0 2 -1

最主要的,就是local_address本地地址:端口、rem_address远程地址:端口、st连接状态。

注1:文件中都是用的16进制,所以HTTP的80端口记录为0050。
注2:状态码对应如下

  1. 00  "ERROR_STATUS",
  2. 01  "TCP_ESTABLISHED",
  3. 02  "TCP_SYN_SENT",
  4. 03  "TCP_SYN_RECV",
  5. 04  "TCP_FIN_WAIT1",
  6. 05  "TCP_FIN_WAIT2",
  7. 06  "TCP_TIME_WAIT",
  8. 07  "TCP_CLOSE",
  9. 08  "TCP_CLOSE_WAIT",
  10. 09  "TCP_LAST_ACK",
  11. 0"TCP_LISTEN",
  12. 0"TCP_CLOSING",

然后介绍nrpe的check脚本。脚本不管怎么写都行,对于nagios服务器端来说,它除了接受脚本的输出结果外,只认脚本运行的退出值(测试时可以运行后用echo $?看),包括OK的exit 0、WARNING的exit 1、CRITICAL的exit 2、未知的exit 3。

最后一个简单的检查http端口连接数的脚本如下:

  1. #!/bin/bash
  2. #Written by Gemmy.Rao
  3. #Email to: <a href="mailto:chenlin.rao@bj.china.com">chenlin.rao@bj.china.com</a>
  4. #Version 0.2
  5. #CHANGES
  6. #Add -p option for checking other service's port
  7. #Init
  8. PORT=80
  9. WARNING=5000
  10. CRITICAL=20000
  11. #get options
  12. while getopts "w:c:p:hs" OPT;do
  13. case $OPT in
  14. w)
  15. WARNING=${OPTARG}
  16. ;;
  17. c)
  18. CRITICAL=${OPTARG}
  19. ;;
  20. p)
  21. PORT=${OPTARG}
  22. #转换各端口的十进制成十六进制
  23. PORT_16=`echo ${PORT}|awk -F, '{for(i=1;i<=NF;i++)printf "|%.4X",$i}'|sed 's/|//'`
  24. ;;
  25. h)
  26. echo "Usage: $0 -w 500 -c 2000 -p 80,8081 -s"
  27. exit 0
  28. ;;
  29. s)
  30. SILENT=1
  31. ;;
  32. *)
  33. echo "Usage: $0 -w 500 -c 2000 -p 80,8081"
  34. exit 0
  35. ;;
  36. esac
  37. done
  38. #经过time测试,取值速度netstat > awk '//{a++}END{print a}' > cat|grep|wc > cat|awk|wc,在2w连接下,netstat要20s,最快的方式不到5s(一般nagios到10s就该直接报timeout了)
  39. PORT_CONN=`cat /proc/net/tcp*|awk '$2~/:('$PORT_16')$/'|wc -l`
  40. if [[ "$SILENT" == 1 ]];then
  41. [[ -d /usr/local/nagios ]] || mkdir -p /usr/local/nagios
  42. echo "Silent log write OK | Port ${PORT}=${PORT_CONN};${WARNING};${CRITICAL};0;0"
  43. echo -en "`date`t$PORT_CONNn" >> /usr/local/nagios/conn.log
  44. exit 0
  45. elif [[ "$PORT_CONN" -lt "$WARNING" ]];then
  46. echo "Port $PORT connection OK for $PORT_CONN. | Port ${PORT}=${PORT_CONN};${WARNING};${CRITICAL};0;0"
  47. exit 0
  48. elif [[ "$PORT_CONN" -gt "$CRITICAL" ]];then
  49. echo "Port $PORT connection critical for $PORT_CONN!! | Port ${PORT}=${PORT_CONN};${WARNING};${CRITICAL};0;0"
  50. exit 2
  51. else
  52. echo "Port $PORT connection warning for $PORT_CONN! | Port ${PORT}=${PORT_CONN};${WARNING};${CRITICAL};0;0"
  53. exit 1
  54. fi

之后有必要的话,可以再取$4去统计st。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/436174
推荐阅读
相关标签
  

闽ICP备14008679号