好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ubuntu crontab 定时备份postgres数据库并上传ftp服务器

#!/bin/ bash 2 3 #服务器参数配置 4 DUMP=/usr/lib/postgresql/ 9.3 /bin/ pg_dump #pg_dump备份文件执行路径 5 OUT_DIR=/home/ postgres_data #备份存放路径 6 LINUX_USER= root #系统用户名 7 DB_USER=postgres #数据库账号 #注意:非root用户要用备份参数 --skip-lock- tables,否则可能会报错 8 FTP_IP= 127.0 . 0.1 # ftp ip 9 FTP_PORT= 21 # ftp port 10 FTP_USR=cz # ftp user 11 FTP_PWD=cz # ftp password 12 DAYS= 7 #DAYS= 7代表删除7天前的备份,即只保留最近7天的备份 13 14 cd $OUT_DIR #进入备份存放目录 15 DATE=` date +%Y_%m_% d` #获取当前系统时间 16 OUT_SQL= " $DATE.sql " #备份数据库的文件名 17 TAR_SQL= " mysqldata_bak_$DATE.tar.gz " #最终保存的数据库备份文件名 18 $DUMP -U$DB_USER -E utf- 8 > $OUT_SQL #备份 19 tar -czf $TAR_SQL ./$OUT_SQL #压缩为. tar .gz格式 20 rm $OUT_SQL #删除.sql格式的备份文件 21 chown $LINUX_USER:$LINUX_USER $OUT_DIR/ $TAR_SQL #更改备份数据库文件的所有者 22 find $OUT_DIR -name " mysqldata_bak_* " -type f -mtime +$DAYS -exec rm {} \; #删除7天前的备份文件 23 deldate=` date -d -7day +%Y_%m_% d ` #获取7天前的时间 24 ftp -n<<! 25 open $FTP_IP $FTP_PORT #打开ftp服务器。21为ftp端口 26 user $FTP_USR $FTP_PWD #用户名、密码 27 binary #设置二进制传输 28 #cd mysqlbak #进入ftp目录(这个目录必须为ftp空间真实存在的目录) 29 lcd /home/postgres_data/ #列出本地目录 30 prompt 31 put mysqldata_bak_$DATE. tar .gz mysqldata_bak_$DATE. tar .gz #上传目录中的文件 32 delete mysqldata_bak_$deldate. tar .gz mysqldata_bak_$deldate. tar .gz #删除ftp空间7天前的备份 33 close 34 bye ! 备份shell

 

②编写crontab文件,使bk.sh定期执行。注意是root用户。

vi  /etc/crontab

在相同格式的地方加上:* * * * * root 脚本绝对路径。

保存即可,因为系统级只需保存即可生效。我验证过。

这里是完成过程中遇到的问题和解决方案:

问题1:

关于crontab有两种方式,一个是/etc/crontab。另一个是crontab -e。不知道两者的区别?

答案:前者系统级别的,后者是用户级别的。最好用前者,原因crontab详解1.

补充:

 1 . 使用crontab - e命令
这个命令的使用比较简单。直接输入
 ~# crontab - e
就会打开一个编辑窗口,第一行会有内容格式的提示:
# m h  dom mon dow   command
具体意义表示:分钟 小时 日期 月份 星期 命令,在某月(mon)的某天(dom)或者星期几(dow)的几点(h,24小时制)几分(m)执行某个命令(command), * 表示任意时间。例如:
  3  * * * * /home/meng/ hello.sh
就是:每小时的03时执行 /home/meng/ 下的hello.sh脚本。
在保存之后,根据屏幕下面的提示输入Ctrl + X退出,此时会提示是否保存,输入Y;提示输入文件名,并且有一个临时的文件名,由于只是测试,直接回车保存。
注意:在完成编辑以后,要重新启动cron进程:
 ~# /etc/init.d/ cron restart
观察运行结果,会发现hello.sh会每隔一小时,在03分时被执行一次。
 
在使用这个命令时,最大的担心就是在系统重启以后是否还能顺利执行呢?我重启系统以后发现一切正常,于是打消了这个顾虑。但是,仍然有一个问题,一般情况下,服务器都是在重启后处于登录状态下,并没有用户登入。那么如果我在执行crontab  - e命令时,不是使用root账户,那么在系统重启之后是否还会顺利执行呢?
 
  2  . 编辑crontab文件
crontab位于 /ect/文件夹,在http: //  wiki.ubuntu.org.cn/CronHowto上有关于它的详细介绍,但是我看的不是太懂。 
 打开crontab文件,如果没有编辑过可以看到如下类似的内容:
#  /etc/crontab: system- wide crontab
# Unlike any other crontab you don  ‘  t have to run the `crontab  ‘  
# command to install the   new  version when you edit  this   file
# and files   in  /etc/ cron.d. These files also have username fields,
# that none of the other crontabs   do  .
SHELL =/bin/ sh
PATH =/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/ bin
# m h dom mon dow user  command
  17  *    * * *   root    cd / && run-parts --report /etc/ cron.hourly
  25   6     * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/ cron.daily )
  47   6     * *  7    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/ cron.weekly )
  52   6      1  * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/ cron.monthly )
由于对脚本的认知有限,不能详细解释每个命令的含义。在第10行,同样定义了文件内容的格式。可以看到比使用crontab  - e命令时,多了一个user。它表示了执行命令的用户,如果是root,就表明是系统用户。于是,我加了如下一行:
  3  * * * * root /home/meng/ hello.sh
然后保存文件即可,我验证过,不需要重启。 
crontab详解1

 

 关于crontab:

crond和crontab

cron是linux提供的一种服务器,用于定期执行shell命令。主要由两部分组成

crond:cron服务的守护进程,用于定期调度
crontab:cron提供的UI,用于编辑调度计划
crontab的使用方法,大家可以man一下,如下图:

clip_image002

主要有三个选项:

[ - e]编辑:与vim类是,但是在保存退出时,他会帮你检查任务语法;
[ - l]列举所有任务;
[ - r]删除所有任务;
P.S.: 目前介绍的是基于当前用户的crontab,系统级别的crontab见后面介绍。

 

基本语法

cron的语法很简单,如下:

【调度频率】 shell命令

看个例子:

clip_image004

可以看出,前面分别是分钟,小时,天,月和周,最后是shell命令。cron调度的最小频率为1分钟。上面这段调度的意思是:[每天10点30分,执行 /some/path/ do_something.sh]。

以上命令中每一块的具体意义如下:

意义

分钟

小时

天

月份

周

命令

范围

  0 - 59 

 0 - 23 

 1 - 31 

 1 - 12 

 0 - 7  

shell命令

P.S.: [周]这一栏中0和7都代表周日

P.S.: 每个月的最后一日无法由crontab直接支持,需要通过脚本判断,参见这里。

P.S.: 命令最好是绝对路径

还有一些辅助的符号,可以借助他们写出更灵活的调度

特殊字符

代表意义

 * (星号)

代表任何时候都接受,比如上面的例子,day,month和week为[ * ],表示无论那个月,那一天,周几,都在10点30分执行命令。

,(逗号)

并列时间。举个例子:

 *  3 , 6 , 9 , 12  * * *  command

上面的意思是在3点,6点,9点或12点,执行命令。

 - (减号)

连续区间。举个例子:

 *  9 - 17  * * *  command

上面的意思是从9点到17点,每一分钟都要执行这个任务

 / n(斜线)

n代表数组,表示每隔n个单位之间,比如每隔5分钟,可以写成下面

 */ 5  * * * *  command

 

一些例子

  59   23   11   27  * mail benben < /home/dmtsai/lover.txt  //   每一年11月27日23分59 秒发一封情书给benben 
 0   17  * *  5  mail all_members < weekily_report_notify  //   每周五5点整,提醒所有组员发周报 
 系统级的crontab

系统级的crontab只有root权限有权编辑,该crontab是一个文件,位置为 /etc/ crontab,

系统级别的crontab的语法与上面稍微不一样,需要在频率和命令之间添加命令执行者,如下所示,并且可以添加一些全局变量,在调度中使用:

clip_image006

详细的系统级调度可以参见这里。

这里需要强调 / etx目录下几个与cron有关的目录和文件,如下所示

clip_image008

cron.d:目录,此目录下以及子目录中所有符合调度语法的文件都会被执行
cron.deny与cron.allow:此文件记录拒绝和允许执行的帐号,cron.allow的优先级大于cron.deny,建议一般只留一个就可以
cron.daily /hourly/monthly/ weekly:这些目录里面全部都是脚本,分别在指定的时间里面执行。
 

绝对路径

虽然crontab执行,可以理解为手动执行的定时触发。但是,执行过程中的路径仍然有所区别,很多情况下手动执行成功,但是crontab不成功,多半是由于采用了相对路径。所以,使用crontab时,尽量采用绝对路径。结果一些实践,总结了一条经验:如果命令手动可以执行成功,但是crontab失败,那么就需要重点关注相关路径问题。 
crontab详解2

 

ubuntu crontab 定时备份postgres数据库并上传ftp服务器

标签:

查看更多关于ubuntu crontab 定时备份postgres数据库并上传ftp服务器的详细内容...

  阅读:30次