3月 25

导出mysql 上传到ftp备份

导出mysql的库上传到ftp服务器备份,上传完毕删除本地文件。用crontab定时运行。用shell也很容以实现,毕竟在学习python,练习一下。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
# ——————————————————————————-
# Filename: Back mysql
# Revision: 1.0
# Date: 2010-03-24
# Author: simon-zzm
# Email: simon-zzm@163.com
# Description:
# ——————————————————————————-
import os,time,sys
from ftplib import FTP
import datetime

###################设置参数
mysql_user=’root’
mysql_pass=’123456′
mysql_comm=’/usr/local/mysql/bin/mysqldump’
mysql_data=[‘test_a’,’test_b’] ###可以填写多个库
mysql_local_path=’/usr/local/checksystem/’
ftp_ip=’x.x.x.x’
ftp_user=’ftpuser’
ftp_pass=’test’
admin_mail=’simon-zzm@163.com’
###################开始运行
#导出的文件为gz的压缩文件,命名格式为ip地址、库名、导出日期组成。
###获得当前时间
get_time_now=time.strftime(‘%Y-%m-%d’)
###获得本机IP地址
ip = os.popen(“/sbin/ifconfig | grep ‘inet addr’ | awk ‘{print $2}'”).read()
get_local_ip = ip[ip.find(‘:’)+1:ip.find(‘n’)]
for i in mysql_data:
###拼成包名
mysql_back_name=mysql_local_path+get_local_ip+’_’+i+’_’+get_time_now+’.gz’
###拼成导出命令
gzip_command = “%s -u%s -p%s –opt %s |gzip >%s” %(mysql_comm,mysql_user,mysql_pass,i,mysql_back_name)
###导出并判断是否成功
if os.system(gzip_command)==0:
print ‘Back Successful’
###导出成功上传到ftp服务器
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect(ftp_ip,’21’)
ftp.login(ftp_user,ftp_pass)
file_handler = open(mysql_back_name,’rb’)
bufsize = 1024
ftp.storbinary(‘STOR %s’ % os.path.basename(mysql_back_name),file_handler,bufsize)
ftp.set_debuglevel(0)
file_handler.close()
ftp.quit()
print ‘up load over!’
###偷个懒使用linux命令将本地文件删掉。
os.popen(“/usr/bin/find “+mysql_local_path+”* -name *.gz -exec rm -rf {} ; “)
else:
print ‘false’
###如果导出失败,给管理员发个信,偷个懒使用linux命令解决。
mail_url=”/bin/mail -s “+get_local_ip+”back fail “+admin_mail+” os.popen(mail_url)

3月 18

Linux系统下shell用telnet通过smtp发邮件

之前shell中都是使用mail命令发邮件,但是出现一个问题,服务器在内网,必须使用smtp
服务。实现发邮件有两种方法。一、修改sendmail的配置,然后还是用mail命令,二、使用telnet
方式来发邮件。我将第二种方法记录下来。
我的smtp不需要认证服务,调用函数需要传入的参数依次为:发送人的邮件地址、收件人的
邮件地址、邮件主题、邮件内容、smtp的IP地址、smtp的端口

send_mail()
{
    (for i in "ehlo localhost.localdomain" "mail FROM:<${1}>" "rcpt TO:<${2}>" "data";
     do 
         sleep 1
         echo ${i}
         sleep 2
     done 
     echo "from:<${1}>"
     echo "subject:${3}"
     echo "to:<${2}>"
      echo ""
     echo "${4}"
     echo "."
     sleep 2 
     echo "QUIT")|telnet ${5} ${6}
}

#调用并传入参数
send_mail “simon-zzm@163.com” “test@test.com” “test” “ok!” “192.168.11.1” “25”

3月 15

linux定时重启单台上多个tomcat

tomcat长期运行会越来越慢,所以需要定时重启单台上多个tomcat,写一个脚本放在crontab定时运行。脚本如下,需要注意脚本中使用了了linux中的mail命令,在tomcat启动失败时可以发送提醒邮件。(不知道为什么贴到这里格式会乱,只能手动整理)

#!/bin/sh
# ——————————————————————————-
# Filename: tomcat_reboot.sh
# Revision: 1.0
# Date: 2010-03-01
# Author: simon
# Email: simon-zzm@163.com
# Description:
# ——————————————————————————-
# Source function library.
. /etc/init.d/functions
source /etc/profile

#######set tomcat patch
tomcat_path=(“/program/tomcat_a/” “/program/tomcat_b/”)

#######set tomcat_key patch
tom_key_path=(“tomcat_a” “tomcat_b”)

###### set bases data
admin_mail=simon-zzm@163.com
IP=`/sbin/ifconfig |grep ‘inet addr:’|grep -v ‘127.0.0.1’|awk ‘ ”{print $2}’`

###### send alert mail
send_mail()
{
echo ${IP}” “${1}” can not stop…” >${2}tom_mail.log
/bin/mail -s ${1}’-‘${IP} ${admin_mail}<${2}tom_mail.log
/bin/rm -rf ${2}tom_mail.log
}

###### delete tomcat`s work dir and startup server
del_start()
{
/bin/rm -rf ${1}work/*
$1bin/startup.sh
}
######main()
for (( i=0 ; i < ${#tomcat_path[@]} ; i++ ))
do
${tomcat_path[i]}bin/shutdown.sh
sleep 3
get_pid_count=`/bin/ps -ef|grep -v grep|grep ${tom_key_path[i]}|wc -l`
if [ ${get_pid_count} -gt 0 ] ; then
/bin/ps -ef|grep -v grep|grep ${tom_key_path[i]}|awk ‘ ”{print $2}’|xargs kill -9
sleep 5
get_pid_count=`/bin/ps -ef|grep -v grep|grep ${tom_key_path[i]}|wc -l`
if [ ${get_pid_count} -gt 0 ] ; then
send_mail ${tom_key_path[i]} ${tomcat_path[i]}
else
del_start ${tomcat_path[i]}
fi
else
del_start ${tomcat_path[i]}
fi
sleep 3
get_pid_count=`/bin/ps -ef|grep -v grep|grep ${tom_key_path[i]}|wc -l`
if [ ${get_pid_count} -lt 1 ] ; then
send_mail ${tom_key_path[i]} ${tomcat_path[i]}
fi
done

3月 01

shell 打印拷贝进度

写了一个脚本做大量数据拷贝,但是拷贝的时间比较常,不知道当前进度如何,是否死机,于是写了一段关于拷贝百分比的输出,详细参见以下脚本。

#!/bin/bash
# ——————————————————————————-
# Filename: copy_percent.sh
# Revision: 1.0
# Date: 2011-03-01
# Author: simon-zzm
# Email: simon-zzm@163.com
# ——————————————————————————-

SOURCE=$1
TARGET=$2

/bin/cp -r “$SOURCE” “$TARGET” &

compute_percent() #
{
SOURCE_SIZE=`/usr/bin/du -s ${1}|awk ‘ ”{print $1}’`
TARGET_SIZE=`/usr/bin/du -s ${2}|awk ‘ ”{print $1}’`
let “i=(${TARGET_SIZE}*100)/${SOURCE_SIZE}”
return $i
}

compute_percent ${SOURCE} ${TARGET}
while [ ${i} -lt ‘100’ ]
do
compute_percent ${SOURCE} ${TARGET}
echo $i’%’
sleep 1
done
echo “ok”

7月 12

转帖 linux echo 显示颜色

echo要变换颜色的时候,要使用参数-e
格式: echo -e “33[字背景颜色;字体颜色m字符串33[0m”
例如:
echo -e “33[41;36m something here 33[0m”
其中41的位置代表底色, 36的位置是代表字的颜色
那些ascii code 是对颜色调用的始末.
33[ ; m …… 33[0m
让字体变为红色并且不停的闪烁
#echo -e “33[31m 33[05m 请确认是否要停止当前的squid进程,输入 [Y/N] 33[0m”
或者
#echo -e “33[31m 33[05m 请确认是否要停止当前的squid进程,输入 [Y/N] 33[0m”
字背景颜色范围:40—-49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
字颜色:30———–39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
===============================================ANSI控制码的说明
33[0m 关闭所有属性
33[1m 设置高亮度
33[4m 下划线
33[5m 闪烁
33[7m 反显
33[8m 消隐
33[30m — 33[37m 设置前景色
33[40m — 33[47m 设置背景色
33[nA 光标上移n行
33[nB 光标下移n行
33[nC 光标右移n行
33[nD 光标左移n行
33[y;xH设置光标位置
33[2J 清屏
33[K 清除从光标到行尾的内容
33[s 保存光标位置
33[u 恢复光标位置
33[?25l 隐藏光标
33[?25h 显示光标