短信通知服务器运行状态
[总点击:193次]最近组上买了一台联想的 thinkcenter M8000t 做服务器,俺只好义不容辞的做管理员了(其实是我怂恿老板掏钱买滴,嘿嘿), 随时了解机器的运行状态是很重要的,当在有联网电脑的地方时还好说,但是如果你在外面而又想了解其运行状态的话就不好办咯。当然如果你的手机也能 ssh 的话就当俺没说(我可没那么高级的手机),手机虽然是次点,不过好歹能收短信吧,主意来了: 用短信收取服务器的运行状态。
说到用短信收机器信息,可能很多童鞋会想到用飞信,但是由于我前些时候写了个短信控制电脑的半成品,就不再用飞信了,我可不想做重复的工作。我就查有没有能短信通知的邮箱呢?还真有,这不,移动居然可以把手机号当成其139邮箱的用户名,而且支持邮件到达短信通知,赶紧给开通了。万事具备,开工。
我想知道的服务器信息包括 cpu 温度, 硬盘温度, 网络速度, 负载等, 其中 cpu 温度可以用 lm_sensors 来监控, 硬盘温度用 hddtemp 来监控,网络总流量可以用 cat /proc/net/dev 获取,除以时间间隔就可以得到速度,而负载就简单的一个 uptime 命令即可。
操作:
首先装上 lm_sensors 和 hddtemp, 然后启动两个服务 (arch下在这里: /etc/rc.d/sensors 和 /etc/rc.d/hddtemp) 只有启动了这两个服务才可以随时获取其提供的信息。hddtemp 提供了网络接口,可以用 netcat 查询 7634 端口获得硬盘信息,下面我写了个小 bash 脚本来集中获取所需信息,代码如下:
server_stat.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/bin/bash # Name: server_stat.sh # Author: xiooli <xioooli[at]yahoo.com.cn> # Site: http://joolix.com # Licence: GPLv3 # Version: 100113 stat() { sensors | grep Core | awk '{print $1, $2, $3}' | tr -d '+' netcat localhost 7634 | awk -F'|' '{print $2":"$4" 度"}' [ -f /tmp/net-stat ] || :> /tmp/net-stat net_last="$(cat /tmp/net-stat)" net_crt="$(cat /proc/net/dev | grep eth0 | awk -F"[: ]" '{print $4,$6}')" crt_time="$(date +%s)" echo "$net_crt $crt_time" > /tmp/net-stat [ "$net_last" ] && { last_in="$(awk '{print $1}' <<< "$net_last")" last_out="$(awk '{print $2}' <<< "$net_last")" last_time="$(awk '{print $3}' <<< "$net_last")" crt_in="$(awk '{print $1}' <<< "$net_crt")" crt_out="$(awk '{print $2}' <<< "$net_crt")" gap="$(($crt_time-$last_time))" speed_in="$(bc -l <<< "scale=4;($crt_in-$last_in)/($gap*1024)")" speed_out="$(bc -l <<< "scale=4;($crt_out-$last_out)/($gap*1024)")" echo -e "speed out:$speed_out k/s\nspeed in:$speed_in k/s" } uptime } send_ok=0 s="`stat | tr '\n' '|' | sed 's|°C| 度|g' | iconv -f utf-8 -t gbk -c`" while [ "$send_ok" = "0" -a "$s" ]; do python "`dirname $0`/mailnotify.py" "$s" [ "$?" = "0" ] && send_ok=1 sleep 10 done |
这个脚本调用了一个叫 mailnotify.py 的 python 脚本来发送邮件(当然你也可以用其他的命令行的邮件客户端)
mailnotify.py (ps: 此脚本极不规范,凑合能用而已)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/usr/bin/env python # -*- coding: utf-8 -*- # Name: mailnotify.py # Author: xiooli <xioooli[at]yahoo.com.cn> # Site: http://joolix.com # Licence: GPLv3 # Version: 100113 '''发送信息到某邮箱,可以用着定时获取服务器的状态(139 邮箱支持邮件短信提醒)''' import smtplib, os, time, sys def send(): smtp = 'smtp.139.com' # 可以到信短信提醒的邮件服务器 smtp 地址, 这里用 139 的 from_ = 'status <status@xx-server>' #这样写收到的短信第一行才不会只是个[] to = 'xxx@139.com' # 你想发送到的账户(邮件到此账户即发送短信提醒,所以用你手机号绑定的那个账户) user = 'xxx' # 用户名 password = 'yyy' # 密码 subject = 'status of np-server ' + time.strftime('%Y-%m-%d %H:%M', time.localtime()) # 这里可以定义邮件的标题 text = sys.argv[1].replace("|", "\r\n") #从命令行收到的信件文本,换行替换成 |, 在此地复原 msg='To: ' + to + '\r\nFrom: ' + from_ + '\r\nSubject: ' + subject + '\r\n\r\n' + text s = smtplib.SMTP(smtp) login_stat = s.login(user, password) if login_stat[0] == 235: send_stat = s.sendmail(to, to, msg) # 之所以发件账户和收件账户一致是为了不用两个不同的邮箱,这里相当于是自己给自己发邮件,而收到自己发的邮件以后又会短信到你的手机,目的达到 if not send_stat: return 0 else: return 1 send() |
然后编辑 cron 任务将命令指向 server_stat.sh 按时发送运行状态。
ps:其实你也可以将获取的新闻之类的东西按时短信给你,这在外地(比如山区)等不能上网的地方是个不错的获取实时信息的好方法诶,呵呵。
最近评论