用于计划备份的 cron 脚本

用于计划备份的 cron 脚本

我正在寻找一个可以进行一些备份的 cron 脚本。我主要是一名 Web 开发人员,因此对 bash/cron 的东西还比较陌生。

我希望 cron 每天将“filelist.txt”中的所有文件或目录复制到已安装的网络存储驱动器中。理想情况下,它可以在我所有的 3 个盒子上运行,1 个 fedora 1 个 ubuntu 和 1 个 sunos(每个盒子中的文件名不同)

棘手的部分是:我只想保存过去 7 天的备份,并删除任何更早的备份

答案1

我确信有些人可以在这方面取得很大进步,但它可能会帮助你起步。

您需要的命令可能是 find,用于扫描并确定要备份的文件列表,然后根据您的喜好使用 tar、cpio 或 zip 进行存档。

我会稍微修改一下你的规范来扫描目录而不是单个文件。

假设 /etc/backupdirlist.txt 包含要扫描的目录列表,/media/backup 是备份媒体的挂载点(已挂载),/media/backup/backups 是一个已经存在的目录,您希望将备份和文件列表放置在其中。

如果在备份过程中使用星期几作为目标文件名并覆盖旧文件名,那么满足七天的要求并不难。

你需要一些类似的东西

(注意:未经测试,可能有错误,如果出现愚蠢的情况,请原谅,适用 GNU LGPL 许可证和标准免责声明)

我建议一次只看一个命令,用 echo $VAR 检查变量或用 less 检查文件以了解它的作用。另外,请阅读 find 和 cpio 的手册页。

#!/bin/bash
DIRLIST=/etc/backupdirlist.txt
DAYOFWEEK=`date +%a`
FILELISTDEST=/media/backup/backups/$DAYOFWEEK.filelist
BACKUPDEST=/media/backup/backups/$DAYOFWEEK.backup.tgz
TIMELIMIT=-1  # says save everything modified less than or equal to one day ago
echo >$FILELISTDEST   # to erase last weeks list
for DIR in `cat $DIRLIST` 
 do find $DIR -mtime $TIMELIMIT >>$FILELISTDEST  # >> appends the lists
done
cat $FILELISTDEST | cpio --create --format=ustar | gzip -9 -c >$BACKUPDEST

我还没有解释如何将此脚本放入 cron,我将把这个留给你或其他参与者。在自动化之前,首先确保它能正常工作并能作为脚本完成你想要的工作。

在不同的 UNIX 机器上,制造商提供的标准实用程序(如 find 或 cpio)版本可能有所不同。解决此问题的最佳方法是在所有平台上安装 GNU 版本。Linux 已经有 GNU 版本。

希望这可以帮助!

答案2

我建议您考虑rsync它的--files-from=/path/to/filelist选择。

与此同时,以下是一些改进~drpaulbrewer 的脚本:

#!/bin/bash
dirlist=/etc/backupdirlist.txt
dayofweek=$(date +%a)
backupdest=/media/backup/backups/${dayofweek}.backup.tgz
while read -r dir 
do
    find "$dir" -print0
done < "$dirlist" |
    cpio --null --create --format=ustar | gzip -9 -c > "$backupdest"

这消除了对临时文件的需要,并且能够处理带有空格的文件名。

我已将变量名称改为小写。尽管这些名称与 Bash 本身使用的变量名称不冲突,但出于习惯,我更喜欢不使用全大写的变量名称,以避免名称冲突。如果您愿意,可以使用各种大小写混合格式。您应该始终用引号括住包含文件或目录名称的变量名称。

我已经取消了时间限制,因为如果某些内容没有改变,它就根本不会被备份,或者如果它被改变然后备份然后闲置七天,备份就会被覆盖。

另外,请记住备份的第一条规则:如果您没有成功测试恢复,则不会备份。

在您的 crontab 中添加一行(使用crontab -e),类似于:

0  0  *  *  *  /path/to/backupscript > /dev/null 2>&1

答案3

我觉得这个答案很有用,但没有足够的声誉来点赞。我结合使用了 Dennis Williamson 和 user33903 发布的其他答案(https://serverfault.com/a/110367/149956https://serverfault.com/a/110356/149956) 并提出了下面的脚本在我的其中一台服务器上使用:

注意:我没有包含备份用户组详细信息,并且 backupdestfile 变量中的日期字符串是“+%Y-%m-%d”。

#!/bin/bash
filelist=/etc/backup/filelist.txt
dirlist=/etc/backup/dirlist.txt
backupdestdir=/backup
backupdestfile=$backupdestdir/backup-$(date "+%Y-%m-%d").tar.gz
tmpfile=$(mktemp)
packagedump=/etc/backup/installed-packages.txt
servicedump=/etc/backup/service-config.txt
backupusergroup=not.telling

# generate list of installed packages
dpkg-query -W > $packagedump

# dump current service configuration
sysv-rc-conf --list > $servicedump

# generate list of files to backup, kept in $tmpfile
echo $tmpfile >> $tmpfile
echo $packagedump >> $tmpfile
echo $servicedump >> $tmpfile
cat $filelist >> $tmpfile
cat $dirlist | while read dir
do
    find "$dir" >> $tmpfile
done

# generate the backup archive
cat $tmpfile | cpio --create --format=ustar | gzip -9 -c > $backupdestfile

# cleanup
rm $tmpfile
chown $backupusergroup -R $backupdestdir
chmod og-rwx -R $backupdestdir

答案4

在 Amazon S3 上保存备份非常好。

对于备份,我建议使用 duplicity 和DT-S3-备份bash 脚本。

DT-S3-Backup 旨在使用 duplicity 和 Amazon S3 自动化和简化远程备份过程。配置脚本后,您可以轻松备份、恢复、验证和清理,而无需记住许多不同的命令选项。

相关内容