zoukankan      html  css  js  c++  java
  • ubuntu crontab 定时备份postgres数据库并上传ftp服务器

    最近公司要求备份数据库,所以就查了比较作的资料。废话不多说,入正题。

    目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器。

    经过查找资料,解决方法:

    ①编写备份数据库、打包压缩、上传指定ftp的脚本。

    ②将该脚本加入到ubuntu定期计划任务crontab中。

    下边是执行的步骤:

    ①编写shelll脚本:bk.sh,对于对shell脚本不了解的,可以百度w3cshool shell。

    最好用root用户编写:su root.

    编写完后,添加执行权限,新编写的shel默认没有执行权限,chmod 777 bk.sh.这样才能执行。

    执行脚本:sh bk.sh    或者 直接运行./bk.sh.

    先测试一下bk.sh。看看是否有问题,里边已经有注释。

    注意:bk.sh中涉及路径的都要使用据对路径。因为在crontab中执行时,与在终端执行不同,因为在终端中执行时,有临时的环境变量记载当前的执行路径,

    这样执行时可以更加相对路径找到,可是在crontab中就没有,所以只能用绝对路径

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

    vi  /etc/crontab

    在相同格式的地方加上:* * * * * root 脚本绝对路径 >>BackData.log

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

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

    问题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
  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/cz-blog/p/4526473.html
Copyright © 2011-2022 走看看