首页 > Script > 短信通知服务器运行状态

短信通知服务器运行状态

[总点击:193次]
2010年1月14日

最近组上买了一台联想的 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:其实你也可以将获取的新闻之类的东西按时短信给你,这在外地(比如山区)等不能上网的地方是个不错的获取实时信息的好方法诶,呵呵。

Script ,

本文的评论功能被关闭了.