最近几月公司接了上海电信新的项目“智慧社区”,此项目中我的角色是FAE,负责项目的现场实施、部署方案、升级方案、运维和客服。电信各部门的接口人每次看见我的口头禅就是“有事找XX”,XX当然就是我的名字啦。呵呵,很无奈吧,这么多事对方都是一个个部门的接口人,到我这就是一个人了。

    抛砖引玉就写到这了,言归正传,开始描述孵化出此脚本的过程。

    最近几日,研发发现程序调用电信给出的一个http认证接口小概率的会发生失败。然后查程序也查不出个所以然来,就发邮件给电信网工。电信网工回复的邮件内容大致概括为“不是只有你一家程序在调用我们接口,我们查过日志了,没有问题。请检查或重启你们自己的程序。”

    这下研发着急了,业务平台啊,不是随随便便就能重启的。紧接着就是怀疑本机系统啊、网络啊,是不是这方面的问题造成的(做运维的兄弟们大家心里都明白,这是研发的通病,不会承认是自己开发的程序有问题,呵呵)。

    在此情景下,邮件自然而然的就到我这了咯。我把前因后果看了遍,想了一个比较可行的方法,让tcpdump去验证吧。没办法,本人责任心比较重。

    tcpdump默认是在前端显示的,为了实现自动化运维,肯定得自己写脚本了。

    罗嗦了半天,各位看官请见谅,以下就是整个脚本的全部内容:

 
  
  1. #!/bin/bash 
  2. #tcpdump_port.sh 
  3. #author zhangyu 
  4.  
  5. # Source function library. 
  6. . /etc/rc.d/init.d/functions 
  7.  
  8. DATE=`date +%F` 
  9. PIDFILE=/tmp/tcpdump.pid 
  10. LOGPATH=/root/tcpdump 
  11. LOCALHOST=192.168.2.40 
  12. REMOTEHOST=www.baidu.com
  13. PORT=80 
  14.  
  15. start() { 
  16.     if [ -f $PIDFILE ]; then 
  17.         { 
  18.             PID=`sed '1d' $PIDFILE` 
  19.             echo "Tcpdump (pid $PID) is running ..." 
  20.         } 
  21.     else 
  22.         { 
  23.             nohup tcpdump -e -f -nn -vvv -xx host $LOCALHOST and $REMOTEHOST and tcp port $PORT -w "$LOGPATH/$DATE.pcap" & 
  24.             ps -ef |grep tcpdump|grep -v grep|awk '{print $2}' >$PIDFILE 
  25.             echo -e "Tcpdump start                      [ \033[32;49;1mok\033[39;49;0m ]" 
  26.         } 
  27.     fi 
  28.  
  29. stop() { 
  30.     if [ -f $PIDFILE ]; then 
  31.         { 
  32.             PID=`sed '1d' $PIDFILE` 
  33.             kill -2 $PID 
  34.             rm -rf $PIDFILE 
  35.             echo -e "Tcpdump stop                       [ \033[32;49;1mok\033[39;49;0m ]" 
  36.         } 
  37.     else 
  38.         { 
  39.             echo "Tcpdump is stopped" 
  40.         } 
  41.     fi 
  42.  
  43. status() { 
  44.     if [ -f $PIDFILE ]; then 
  45.         { 
  46.             PID=`sed '1d' $PIDFILE` 
  47.             echo "Tcpdump (pid $PID) is running ..." 
  48.         } 
  49.     else 
  50.         { 
  51.             echo "Tcpdump is stopped" 
  52.         } 
  53.     fi 
  54.  
  55. case "$1" in 
  56.     start) 
  57.         start 
  58.         ;; 
  59.     stop) 
  60.         stop 
  61.         ;; 
  62.     restart) 
  63.         stop 
  64.         start 
  65.         ;; 
  66.     status) 
  67.         status 
  68.         ;; 
  69.     *) 
  70.         echo "Usage:$0 {start|stop|restart|status}" 
  71.         ;; 
  72. esac 
    代码中LOCALHOST、REMOTEHOST和PORT三者的变量值我都修改过了,公网实际在跑的服务器肯定不是这样的啦,你懂的!
 
    脚本执行的目前简单说一下,当192.168.2.40主机向www.baidu.com:80请求时,会生成TCP的交互记录,并生成日志保存在/root/tcpdump/目录下。附个图,大家看的更明白些。

至于tcpdump是干什么的,怎么用,还请自行百度、google、51CTO都行,不过最好的帮助可是man tcpdump哦。
 
    最后在crontab里做个计划任务,每天凌晨restart一下脚本,自动化运维完成了。至于是不是把脚本加入rc.local啊、/etc/init.d/下啊,暂时先不考虑。
 
    脚本虽然不复杂,就那么几行代码,但是严谨的态度一定要有,没有N次的测试和优化,我是绝对不会把它放入公网正在运行的服务器中的,希望借此文能激励下做研发的兄弟们。
 
    希望是美好的,现实是……
 
PS:本文技术部分如有错误,还望高人路过指点一二,万分感谢!