最近服务器频率出现文件损坏和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 &