最近服务器频率出现文件损坏和IO错误,用fsck修复文件系统后问题反复出现,原因暂时没找到。
于是从内网准备了一台临时备份的服务器(假设为cpp65),用rsync从生产服务器(假设为cpp22)同步,
这里有个问题,一旦cpp22发生文件损坏,同步到cpp65备份的文件也是损坏的。于是需要做一个条件判断cpp22的文件是否健康,从而决定是否进行文件,当发生IO错误时,不进行同步,并向管理员发送一条飞信消息。

步骤如下:
1.安装PyWapFetion

wget https://github.com/whtsky/PyWapFetion/archive/master.zip
unzip master
rm master
cd PyWapFetion-master/
python setup.py install 

这样就完成了。
如果安装出错,需要安装setuptools,步骤如下:

wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
python ez_setup.py

顺便把pip安装上

curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python get-pip.py

用pip可一行命令安装pywapfetion

pip install PyWapFetion

2.测试飞信给自己发信。新建一个文件 send2self.test,写入以下内容

 #!/bin/env python
 from __future__ import with_statement
 from PyWapFetion import Fetion, send2self, send
 send2self('手机号', '密码', 'hello fetion')

运行后,如果成功将收到一条内容为 hello fetion 的短信

3. vi /usr/bin/send2self,写入内容,并增加可执行权限

#!/bin/env python
from __future__ import with_statement
from PyWapFetion import Fetion, send2self, send
import sys
phone = '默认手机号'
psw = '飞信密码'
if len(sys.argv) ==1:
        msg = "fetion send to self test"
elif len(sys.argv) == 2:
        msg = sys.argv[1]
elif len(sys.argv) == 4:
        psw = sys.argv[2]
        phone = sys.argv[1]
        msg = sys.argv[3]
else:
    sys.exit('invalid arguments')

print send2self(phone, psw, msg)

4.文件同步,在此之前需要先在cpp65进行ssh无密码登录cpp22系统,参考:实战SSH Forward、ssh-copy-id、autossh及其他
假设要将cpp22的/source目录同步到cpp65的/backup,如果同步完成将向用户发送一条飞信消息,
新建脚本sync_from22.sh,内容如下:

#!/bin/bash

mkdir /log/syncFromRemote >/dev/null 2>&1
check_time=`date +%y%m%d%H%M`
log='/log/syncFromRemote/'$check_time
echo `ssh cpp22 du -h --max-depth=1 /source` >$log 2>&1
broken=`/bin/grep "cannot access" $log | wc -l`
if [ $broken != "0" ]
then 
	#broken files found, sms alert
	sms="brocken files found:"$check_time 
	/usr/bin/send2self "$sms" 2>/dev/null
else
	#files are OK, safe to sync
	rsync_log_dir='/log/rsyncToLatestFrom22/'
	mkdir $rsync_log_dir >/dev/null 2>&1
	rsync_log=$rsync_log_dir$check_time
	rsync -auvzH --progress cpp22:/source/ /backup 2>&1 | tee $rsync_log
        #成功时不需要用飞信通知时,后面4行可省略
	file_total=`/bin/grep "100%" $rsync_log | wc -l`
	send_amount=`tail -2 $rsync_log`
	sms="sync files total:"$file_total"****"$send_amount 
	/usr/bin/send2self "$sms" 2>/dev/null
       
fi

5.加入定时任务,当前10分钟同步一次。

*/10 * * * * /root/sync_from22.sh >/dev/null 2>&1 &
- EOF -