有关备份的BASH脚本的建议

时间:2012-10-04 13:33:06

标签: bash backup centos plesk

我有一台安装了plesk的服务器(centOS),我需要为每天规划一些备份。 Plesk只允许一次计划备份,所以我创建了这个解决方案:

  1. 每晚在文件夹中创建备份
  2. 启动一个脚本,该脚本将从文件夹内的txt文件标题中读取当天(每晚通过cronTAB启动)
  3. 将备份文件移到正确的directoy中(基于当天的名称)
  4. 更改txt标题中的日期名称
  5. 这是我的脚本(目前尚未测试):

    BACKUPNAME="backupname"
    cd /backup/daily
    find . -type f | while IFS= read filename; do
      case "${filename,,*}" in 
        mon.txt) mv $BACKUPNAME ../mon
        mv mon.txt tue.txt;;
        tue.txt) mv $BACKUPNAME ../tue
        mv tue.txt wed.txt;;
        wed.txt) mv $BACKUPNAME ../wed
        mv wed.txt thu.txt;;
        thu.txt) mv $BACKUPNAME ../thu
        mv thu.txt fri.txt;;
        fri.txt) mv $BACKUPNAME ../fri
        mv fri.txt sat.txt;;
        sat.txt) mv $BACKUPNAME ../sat
        mv sat.txt sun.txt;;
        sun.txt) mv $BACKUPNAME ../sun
        mv sun.txt mon.txt;;
        * : ;; #nothing
      esac
    done
    

    你认为这是一个好的/稳定的解决方案吗?

    谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道“只有一个计划备份”是什么意思,你能解释一下吗?

另一方面,为什么不进行rsync并在需要时删除最旧的...这就是我这样做的方法:

#!/bin/bash
date=`/bin/date "+%Y-%m-%dT%H_%M_%S"`
HOME=/root

/bin/echo -e "\n\n# Backup from $date\n" >> /var/log/backup.log

/usr/bin/rsync -axzP \
  --delete \
  --delete-excluded \
  --exclude-from=$HOME/.rsync/exclude \
  --link-dest=/COREBACKUP/CurrentBackup \
  / /COREBACKUP/Backups/incomplete_back-$date >> /var/log/backup.log 2>&1 \
&& mv /COREBACKUP/Backups/incomplete_back-$date /COREBACKUP/Backups/back-$date \
&& rm -f /COREBACKUP/CurrentBackup \
&& ln -s /COREBACKUP/Backups/back-$date /COREBACKUP/CurrentBackup \
&& echo `/bin/date "+%Y-%m-%d - %H:%M:%S"` > /var/log/lastbackup.log 2>&1

这个脚本每天都通过cron调用,它会对“/”进行完整备份,不包括$ HOME / .rsync / exclude中列出的所有内容。

备份存储在/ COREBACKUP / Backups / back- $ date中,最新备份存储在/ COREBACKUP / CurrentBackup中。

它工作正常,虽然它可以写得更加用户友好; - )

答案 1 :(得分:0)

根据日期轮换备份目标是合理的,但问题中显示的名称生成方法取决于每天运行一次的系统。如果系统关闭一天,或者脚本一天运行两次,则mon.txttue.txt,...序列将不同步。不使用文件名和笨重的case语句来获取目标目录的名称,而是使用如下代码:

day=$(date +%a)
mv $BACKUPNAME ../${day,,}

如果备份文件属于与当前不同的日期,请使用date表单,如下所示之一,分别将day设置为昨天的名称,或者设置为当天的名称上次修改文件时。

day=$(date +%a --date=yesterday)
day=$(date +%a -r $BACKUPNAME)