备份日志基本是每一个生产项目必备的功能之一,一般备份日志,就需要shell脚本,先附上自己写的脚本代码,随后再进行简单讲解。第一个shell脚本,bak.sh代码如下:
#!/bin/sh
. /home/efina/.bash_profile;
cd /home/efina/apache-tomcat-7.0.65/logs;
d=$(date "+%Y%m%d%H%M%S");
sold="catalina.out";
file=${sold}${d};
echo $file;
cp /home/efina/apache-tomcat-7.0.65/logs/catalina.out /home/efina/logback/${file}; #备份
gzip /home/efina/logback/${file} #压缩
cat /dev/null > /home/efina/apache-tomcat-7.0.65/logs/catalina.out;
rm -f /home/efina/apache-tomcat-7.0.65/logs/*.log*;
rm -f /home/efina/apache-tomcat-7.0.65/logs/*.txt;
rm -f /home/efina/eFina/logs/*.log*
dbuser=efina;
dbpassword=efina;
dbserver=localhost;
dbname=efina;
dbopt=--opt
mysqldump -u$dbuser -p$dbpassword -h$dbserver $dbopt $dbname > /home/efina/backup/sqlbak/${d}.sql;
rm -f /home/efina/backup/sqlbak/*.gz
gzip /home/efina/backup/sqlbak/${d}.sql
前面五行命令比较简单,就是文件名格式,想要备份的日志文件名,统一为catalina.out20190321102516(日志名+当日时间)的格式,随后用cp命令备份!
后面6行,就是简单的压缩和删除,最后几行,是备份数据库的数据命令。
第二个shell脚本,export.sh:
#!/bin/sh
. /home/efina/.bash_profile;
cd /home/efina/print/;
d=$(date "+%Y%m%d");
dir="/home/efina/print/exportTable/";
rm -f /home/efina/print/exportTable/*;
limitNote="T_PAY_LIMIT_AD_NOTE.txt";
limitFile=${dir}${limitNote};
rm -f ${limitFile};
limitNoteList="T_PAY_LIMIT_AD_NOTE_LIST.txt";
limitListFile=${dir}${limitNoteList};
rm -f ${limitListFile};
limitInit="T_ECFN_LIMIT_INIT.txt";
limitInitFile=${dir}${limitInit};
rm -f ${limitInitFile};
payTransfe="T_PAY_TRANSFE_NOTE.txt";
payTransfeFile=${dir}${payTransfe};
rm -f ${payTransfeFile};
payTransfeList="T_PAY_TRANSFE_NOTE_LIST.txt";
payTransfeListFile=${dir}${payTransfeList};
rm -f ${payTransfeListFile};
areaComp="T_AREA_COMP.txt";
areaCompFile=${dir}${areaComp};
rm -f ${areaCompFile};
ecfnPay="T_ECFN_PAY.txt";
ecfnPayFile=${dir}${ecfnPay};
rm -f ${ecfnPayFile};
ecfnPayList="T_ECFN_PAY_LIST.txt";
ecfnPayListFile=${dir}${ecfnPayList};
rm -f ${ecfnPayListFile};
payBack="T_PAY_BACK.txt";
payBackFile=${dir}${payBack};
rm -f ${payBackFile};
ecfnJrnl="T_ECFN_JRNL.txt";
ecfnJrnlFile=${dir}${ecfnJrnl};
rm -f ${ecfnJrnlFile};
dbuser=efina;
dbpassword=efina;
dbserver=localhost;
dbname=efina;
dbopt=--opt
mysql -u$dbuser -p$dbpassword <
这两个shell脚本都比较简单,也容易理解,写完shell脚本以后,该如何执行呢?
最常见的办法,就是通过Linux系统的定时任务Crontab命令来控制。由于Linux 系统是由 cron (crond) 这个系统服务来控制的(系统服务是默认启动的,用于Linux 系统原本的计划性工作)。所以,使用者自己也可以根据该命令(crontab 命令)设置自己的计划任务(输入cronttab -e即可显示crontab 命令配置):
补充:什么是crond?
crond 等同于windows下的计划任务,是Linux用来周期性的执行某种任务的一个守护进程,当操作系统安装完后,默认会安装此服务工具且自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
crontab文件格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段:
minute hour day month week command
比如:
30 23 * * * /home/tomcat/tmp/export.sh
10 23 * * * /home/tomcat/tmp/bak.sh
从左到右依次代表:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,一般是自己编写的Shell脚本文件。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下的crontab文件就是系统任务调度的配置文件,/etc/crontab文件包括下面几行:
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
使用者权限文件:
文件1:/etc/cron.deny
该文件中所列用户不允许使用crontab命令
文件2:/etc/cron.allow
该文件中所列用户允许使用crontab命令
文件3:/var/spool/cron/
所有用户crontab文件存放的目录,以用户名命名
每次测试环境测试时,ps进程、kill进程、日志跟踪,很是麻烦,所以就有了第三个shell脚本——重启服务。该进程比较简单,如下:
ps -ef|grep tomcat|grep -v grep|cut -c 9-15|xargs kill -9
#pskill tomcat
sleep 5
~/tomcat7.0.93/bin/startup.sh
tail -f ~/tomcat7.0.93/logs/catalina.out
然后把该进程名配置进环境变量,输入ls -a即可看到.bash_profile文件,加入:
#PATH=$HOME/ .sh
加入环境变量以后,source一下(如果执行权限不足 需授权)