V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
通过以下 Referral 链接购买 DigitalOcean 主机,你将可以帮助 V2EX 持续发展
DigitalOcean - SSD Cloud Servers
funcman
V2EX  ›  VPS

分享个自动备份到Dropbox的脚本

  •  
  •   funcman · 2014-01-19 01:58:42 +08:00 · 1361 次点击
    这是一个创建于 3966 天前的主题,其中的信息可能已经有所发展或是发生改变。
    上次host700跑路,丢了一周的客户网站数据,就因为备份脚本是手工启动的。
    host700跑路后,之前的备份脚本跟着主机一起消失了,只好重新写一份

    =================

    脚本在
    https://github.com/funcman/vps_backup_shell

    使用这个脚本
    首先你需要有这个
    https://github.com/andreafabrizi/Dropbox-Uploader
    按照说明把那个dropbox_uploader.sh丢到比如“~/”目录下
    然后随便传个东西到你的Dropbox上,怎么做看他的说明,这样就能把你的VPS和你的Dropbox进行绑定。

    你还需要装上7z,7z的命令行操作方式比tar差很多啊

    然后把我的脚本和dropbox_uploader.sh放在同一级目录下。

    之后,你要写个工作脚本给cron调用,虽然直接让cron调用我的脚本也可以。
    你的脚本里可以做一些导出数据库到sql文件的操作。

    我的工作脚本:

    #!/bin/bash

    BASEPATH=$(cd `dirname $0`; pwd)

    DBPATH=/tmp/datebase`date +%Y%m%d`

    mkdir -p $DBPATH
    mysqldump -umyname -pmypwd -hlocalhost mydb > $DBPATH/mydb.sql

    $BASEPATH/backup.sh -D"$DBPATH" -fmydb -d7
    $BASEPATH/backup.sh -D/var/www -fmysite -d7

    rm -rf $DBPATH

    -D是需要备份的目录路径,-f是打包时用的名字,-d表示在Dropbox上存最近几天的备份包(超出范围的会被删除)。
    后面两个参数可以不填,那么备份包会以目录名为文件名,并且一直存在。

    注意,使用时把路径都写成完整路径。

    在/etc/crontab填写工作脚本的调用表,一天调用一次即可。

    第一次正儿八经写bash脚本,见笑了。
    28 条回复    1970-01-01 08:00:00 +08:00
    hustlzp
        1
    hustlzp  
       2014-01-19 08:16:15 +08:00 via Android
    赞,正需要这个!
    scg16
        2
    scg16  
       2014-01-19 10:17:51 +08:00 via Android
    小白vps装BT sync多次未成功~
    scg16
        3
    scg16  
       2014-01-19 10:19:07 +08:00 via iPhone
    求高手图文教程
    funcman
        4
    funcman  
    OP
       2014-01-19 13:20:41 +08:00
    试用没问题,请反馈。
    图文全教程等回头写了,最近年底赶个项目爆忙。
    funcman
        5
    funcman  
    OP
       2014-01-19 13:21:39 +08:00
    有问题也反馈
    sdzbzyc
        6
    sdzbzyc  
       2014-01-20 17:55:00 +08:00
    手动上传没有问题,但用crontab就怎么也执行不了
    */1 * * * * root /autobackup.sh
    这样写对吗?
    sdzbzyc
        7
    sdzbzyc  
       2014-01-21 00:42:29 +08:00
    /backup.sh: line 28: 7z: command not found
    2) Click on "Create App", then select "Dropbox API app"
    5) Enter the "App Name" that you prefer (e.g. MyUploader250872416932506)
    > App key is , App secret is and Access level is Full Dropbox. Looks ok? [y/n] # App key: # App secret: # Permission type, App folder or Full Dropbox [a/f]:
    > App key is , App secret is and Access level is Full Dropbox. Looks ok? [y/n] # App key: # App secret: # Permission type, App folder or Full Dropbox [a/f]:

    crontab日志一直就是提示第一次运行Dropbox-Uploader的状态..这个要改哪里呢
    funcman
        8
    funcman  
    OP
       2014-01-21 01:44:10 +08:00
    @sdzbzyc 你没装7z啊。
    Dropbox-Uploader那个,是不是因为你在手动上传时,操作上有什么失误,导致绑定配置没有被保存下来。
    sdzbzyc
        9
    sdzbzyc  
       2014-01-21 10:18:51 +08:00
    @funcman
    7z装了,手动执行7z a 没有问题,不知道为什么会commad not found
    Dropbox-Uploader手动执行脚本可以,不知道为什么丢到crontab里不行了 环境变量不对吗?
    funcman
        10
    funcman  
    OP
       2014-01-21 13:48:14 +08:00
    @sdzbzyc 你的三个脚本放在那个路径下?
    你手动测试时,是用root用户的么?
    sdzbzyc
        11
    sdzbzyc  
       2014-01-21 13:54:33 +08:00
    @funcman 是root用户
    放在~/
    手动可以上传
    > Uploading "/tmp/backup20140121/20140121.mydb.7z" to "/20140121.mydb.7z"... DONE
    > Uploading "/tmp/backup20140121/20140121.kcado.7z" to "/20140121.www.7z"... DONE
    funcman
        12
    funcman  
    OP
       2014-01-21 14:05:04 +08:00
    @sdzbzyc 我不太懂cron。查了下“command not found cron”,有帖子提到是因为cron用的shell是/bin/sh,改成/bin/bash就行了。

    root的crontab文件中加入:
    SHELL=/bin/bash

    你试试。
    funcman
        13
    funcman  
    OP
       2014-01-21 14:08:12 +08:00
    另外,我的系统是Ubuntu。
    funcman
        14
    funcman  
    OP
       2014-01-21 14:14:01 +08:00   ❤️ 1
    哦,所有的路径都用绝对路径。
    你的三个脚本都放在/root下。
    那么crontab里写
    00 15 * * * root /root/autobackup.sh
    (这里是在UTC 15:00执行工作脚本)

    上面那个回复的"SHELL=/bin/bash"别改了。
    sdzbzyc
        15
    sdzbzyc  
       2014-01-21 14:34:34 +08:00
    @funcman
    我是centos 6
    crontab里是
    */5 * * * * root sh /root/autobackup.sh

    脚本里面是
    #!/bin/bash

    EPATH=$(cd `dirname $0`; pwd)

    DBPATH=/tmp/datebase`date +%Y%m%d`

    mkdir -p $DBPATH
    mysqldump -uroot -p643065 -hlocalhost wordpress > $DBPATH/mydb.sql

    /root/backup.sh -D"$DBPATH" -fmydb -d7
    /root/backup.sh -D/home/wwwroot/www.kcado.com -fkcado -d7

    rm -rf $DBPATH

    问题是手动能上传成功呀,你看这个帖子/t/88061 他的问题跟我一样,在crontab里执行就执行第一次启动dropbox-uploader绑定appid的情况,没看明白怎么解决
    funcman
        16
    funcman  
    OP
       2014-01-21 14:48:48 +08:00
    @sdzbzyc 系统差异还是有点的。
    我不知道你是怎么给cron添加任务的。
    我是直接编辑/etc/crontab的
    完整内容:

    # cat /etc/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
    22 * * * * root cd / && run-parts --report /etc/cron.hourly
    32 1 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    35 4 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    18 3 18 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    #

    00 15 * * * root /root/backup_work.sh

    中间那些任务是Ubuntu本来就有的可以无视

    我怀疑是因为你的cron没有配置PATH

    CentOS也是用mail给你返回输出的么?

    如果是,你po一下完整的信件内容。
    funcman
        17
    funcman  
    OP
       2014-01-21 14:50:19 +08:00
    /t/88061是让你改dropbox_uploader.sh里的一句。
    funcman
        18
    funcman  
    OP
       2014-01-21 14:53:25 +08:00
    还有,你是不是把你数据库密码暴露了……
    sdzbzyc
        19
    sdzbzyc  
       2014-01-21 15:00:41 +08:00
    是直接改/etc/crontab

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/

    # For details see man 4 crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # | .------------- hour (0 - 23)
    # | | .---------- day of month (1 - 31)
    # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
    # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # | | | | |
    # * * * * * user-name command to be executed
    */3 * * * * root sh /root/auto.sh >> /root/mylog.log 2>&1
    sdzbzyc
        20
    sdzbzyc  
       2014-01-21 15:10:30 +08:00   ❤️ 1
    @funcman 额 一不小心给贴上来了

    crontab输出的记录..不知道为什么7z not found,手动执行 7z a没有问题


    /root/backup.sh: line 28: 7z: command not found

    This is the first time you run this script.

    1) Open the following URL in your Browser, and log in using your account: https://www2.dropbox.com/developers/apps
    2) Click on "Create App", then select "Dropbox API app"
    3) Select "Files and datastores"
    4) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder
    5) Enter the "App Name" that you prefer (e.g. MyUploader306951655520556)

    Now, click on the "Create App" button.

    When your new App is successfully created, please type the
    App Key, App Secret and the Permission type shown in the confirmation page:

    # App key: # App secret: # Permission type, App folder or Full Dropbox [a/f]:
    > App key is , App secret is and Access level is Full Dropbox. Looks ok? [y/n] # App key: # App secret: # Permission type, App folder or Full Dropbox [a/f]:


    mail里面的也是说7z not found
    To: root@zhao
    Subject: Cron <root@zhao> /autobackup.sh
    Content-Type: text/plain; charset=ANSI_X3.4-1968
    Auto-Submitted: auto-generated
    X-Cron-Env: <SHELL=/bin/bash>
    X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin>
    X-Cron-Env: <MAILTO=root>
    X-Cron-Env: <HOME=/>
    X-Cron-Env: <LOGNAME=root>
    X-Cron-Env: <USER=root>
    Status: RO

    /backup.sh: line 28: 7z: command not found
    /backup.sh: line 29: //dropbox_uploader.sh: No such file or directory
    funcman
        21
    funcman  
    OP
       2014-01-21 17:34:03 +08:00
    你看一下CentOS中7z在那个bin目录下,cron的PATH有没有包含那个目录

    另外,把crontab里的那个HOME从/改为/root
    估计就能找到dropbox_uploader.sh了。

    cron的环境变量真是个坑啊。试试吧,应该就是环境变量的问题。
    funcman
        22
    funcman  
    OP
       2014-01-21 17:34:28 +08:00
    @sdzbzyc 忘记at你
    funcman
        23
    funcman  
    OP
       2014-01-21 17:35:36 +08:00
    回头得弄几个主流系统测试一下。
    sdzbzyc
        24
    sdzbzyc  
       2014-01-21 21:12:04 +08:00
    @funcman
    下午突然就上不去网了...还以为我网络的问题 原来DNS被污染..

    HOME改了后,dropbox_uploader.sh找到了
    找了一下7z是在/usr/loacl/bin,PATH里加入后 还是..
    /root/backup.sh: line 28: 7z: command not found
    > No such file or directory: /tmp/backup20140121/20140121.mydb.7z
    /root/backup.sh: line 28: 7z: command not found
    > No such file or directory: /tmp/backup20140121/20140121.kcado.7z
    难道没找对吗,我是用locate 7z
    funcman
        25
    funcman  
    OP
       2014-01-21 21:50:13 +08:00   ❤️ 1
    @sdzbzyc cron的PATH么?
    sdzbzyc
        26
    sdzbzyc  
       2014-01-21 22:06:55 +08:00
    @funcman
    可以了..cron能自动执行了 刚才是我粗心把PATH写错了..local 敲成loacl了.. 是环境变量的问题
    谢谢,感谢已发送:)
    funcman
        27
    funcman  
    OP
       2014-01-22 01:33:20 +08:00
    @sdzbzyc 祝贺!
    XXOO
        28
    XXOO  
       2014-02-12 16:59:58 +08:00
    加上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2637 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 15:50 · PVG 23:50 · LAX 07:50 · JFK 10:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.