Shell脚本
1. 实现定时备份数据库
需求:
1> 定时备份数据库
2> 删除10天前的备份的数据
3> 将备份的数据库拷贝到另一台机器上,只保存近10天的数据
备份数据库
#!/bin/bash
# backup mindoc db
# backup path
BACKUP_PATH=/xxx/backup_sql
# backup db name
DATETIME=$(date +%Y_%m_%d_%H%M%S)
DB_NAME="mindoc_db_$DATETIME.sql"
echo ${DB_NAME}
#USER
DB_USER=user
#PASSWORD
DB_PWD=password
#Determine and create path
[ ! -d "$BACKUP_PATH" ] && mkdir -p $BACKUP_PATH
#backup mindoc db
SPL_PATH=/usr/local/mysql/bin/
DATABASE=mindoc_db
$SPL_PATH/mysqldump -u${DB_USER} -p${DB_PWD} $DATABASE -R > $BACKUP_PATH/$DB_NAME 2>/dev/null
删除10天前的数据
#delete backup file 10 days ago
find $BACKUP_PATH -mtime +10 -name "mindoc_db_*.sql" -exec rm -rf {} \;
远程cp到另一台机器上,并保存10天内的数据
/usr/bin/expect <<EOF
#scp .sql to 10.150.11.11
spawn scp $BACKUP_PATH/$DB_NAME user@10.150.11.11:/home/user/mindoc_DB/
expect "password:"#这个地方要注意下交互界面上的单词
send "password\r"
expect {
*#* {}#意思是交互界面有#的时候退出,root是#
eof {exit 47;}
}
spawn ssh qa@10.150.11.11:
expect "password:"
send "qa\r"
expect {
*$* {}#意思是交互界面有#的时候退出,普通用户是$
eof {exit 47;}
}
#保留10天内数据
find /home/user/mindoc_DB/ -mtime +10 -name "mindoc_db_*.sql" -exec rm -rf {} \;
expect {
*$* {}
eof {exit 47;}
}
EOF
定时备份,使用crontab定时执行脚本
每天凌晨1点10分执行脚本
# crontab -e
10 1 * * * /home/qa/QA-Tool/mindoc/mindoc_db_backup.sh
2.cron和crontab命令
- cron机制
cron可以让系统在指定的时间,去执行某个指定的工作,我们可以使用crontab指令来管理cron机制
- 参数说明
-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表
-u:这个参数可以让我们去编辑其他人的crontab,如果没有加上这个参数的话就会开启自己的crontab crontab -u 使用者名称
-l:可以列出crontab的内容
- 格式说明
f1 f2 f3 f4 f5 program
f1 是表示分钟
f2 表示小时
f3 表示一个月份中的第几日
f4 表示月份
f5 表示一个星期中的第几天
program 表示要执行的程序
当 f1 为 * 时表示每分钟都要执行 program
f2 为 * 时表示每小时都要执行程序
…
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行
f2 为 a-b 时表示从第 a 到第 b 小时都要执行
…
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次
f2 为 */n 表示每 n 小时个时间间隔执行一次
…
当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行
f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行
f3和f5(日期和星期)是逻辑或的关系
例:
2 3 4,20 * 5 的意思是每月的4号和20号,以及每周五的3点2分执行
…
\ * * * * *
- - - - -
| | | | |
| | | | ±---- 星期中星期几 (0 - 6) (星期天 为0)
| | | ±--------- 月份 (1 - 12)
| | ±-------------- 一个月中的第几天 (1 - 31)
| ±------------------- 小时 (0 - 23)
±------------------------ 分钟 (0 - 59)
- 实例
每一分钟执行一次 /home/demo/run.sh:
* * * * * /home/demo/run.sh
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /home/demo/run.sh:
0 6-12/3 * 12 * /home/demo/run.sh
0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘
1 * * * * /home/demo/run.sh 每小时的第一分执行 /home/demo/run.sh这个文件
00 03 * * 1-5 find /home ".xxx" -mtime +4 -exec rm {} ; 每周一至周五3点钟,在目录/home中,查找文件名为.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
- crontab时间格式范例
1-3表示123
1-9/2表示13579
- crontab服务命令
service crontab start//启动服务
service crontab stop//停止服务
service crontab status//查看服务状态
service crontab reload//重新加载服务配置
service crontab restart//重新启动服务
chkconfig crontab on//开机自启crontab 服务
chkconfig crontab off//关闭开机自启crontab服务
- crontab定时任务执行不成功原因
crond服务未启动
权限问题
路径问题 使用绝对路径
时差问题 使用运行server的时区
3.>/dev/null在shell中的作用
2>表示标准错误
>代表重定向到哪里
/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”
2>/dev/null的意思就是把标准错误输入到空设备文件,将标准输入删掉
1>/dev/null意思讲标准输出到黑洞中,就是不输出任何信息,等同于/dev/null
1>/dev/null 2>&1 是先把标准输出到黑洞中,再把标准错误输出到和黑洞中,即不显示任何错误信息(2的输入重定向等同与1)
4. find 命令
命令:find 对应目录 -mtime +天数 -name “文件名” -exec rm -rf {} \;
将/usr/local/backups目录下所有10天前带"."的文件删除
find /usr/local/backups -mtime +10 -name "*.*" -exec rm -rf {} \;
find /usr/local/backups -mtime +10 -name "*.*" |xargs rm -rf
find:linux的查找命令,用户查找指定条件的文件
-mtime:标准语句写法
+10:查找10天前的文件,这里用数字代表天数,+30表示查找30天前的文件
-exec:固定写法
rm -rf:强制删除文件,包括目录
{} ; :固定写法,一对大括号+空格+\
find 默认在当前 即 . 目录下查找
- 按照文件名查找
find / -name qwe # qwe为文件名
find / -name *qwe* # * 为模糊匹配
- 按照文件类型查找
find / -type d # 查找目录文件
find / -type f # 查找普通文件
find / -type l # 查找链接文件