如何使用bash脚本使用tar备份文件系统?

时间:2012-07-13 09:26:22

标签: bash backup

我想备份我的ubuntu文件系统,我写了这个小脚本。这是非常基本的,但作为我的第一次尝试,我害怕犯错误。由于完成查看结果需要几个小时,我认为如果我做错了,最好问你是有经验的程序员。

我对>特别感兴趣,会记录mv的输出还是输出tar的结果? tar命令中的变量也是正确的方法吗?

#!/bin/bash

mybackupname="backup-fullsys-$(date +%Y-%m-%d).tar.gz"

{ time tar -cfpzv $mybackupname --exclude=/$mybackupname --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev / && ls -gh $mybackupname && mv -v $mybackupname backups/filesystem/ ; } > backup-system.log

exit

在我运行之前我应该​​知道什么?

2 个答案:

答案 0 :(得分:6)

Sandro,您可能需要考虑在脚本中添加内容并产生个别错误。使事情更容易阅读。

#!/bin/bash

mybackupname="backup-fullsys-$(date +%Y-%m-%d).tar.gz"

# Record start time by epoch second
start=$(date '+%s')

# List of excludes in a bash array, for easier reading.
excludes=(--exclude=/$mybackupname)
excludes+=(--exclude=/proc)
excludes+=(--exclude=/lost+found)
excludes+=(--exclude=/sys)
excludes+=(--exclude=/mnt)
excludes+=(--exclude=/media)
excludes+=(--exclude=/dev)

if ! tar -czf "$mybackupname" "${excludes[@]}" /; then
  status="tar failed"
elif ! mv "$mybackupname" backups/filesystem/ ; then
  status="mv failed"
else
  status="success: size=$(stat -c%s backups/filesystem/$mybackupname) duration=$((`date '+%s'` - $start))"
fi

# Log to system log; handle this using syslog(8).
logger -t backup "$status"

如果您想保留调试信息(如tarmv的stderr),可以通过重定向到tmpfile或调试文件来处理。但是如果命令是通过cron运行并且有输出,cron应该通过电子邮件发送给你。沉默的cron工作是一项成功的计划工作。

一系列if s导致每个程序运行,只要前一个程序成功。这就像使用&&链接命令,但允许您在发生故障时运行其他代码。

请注意,我已更改tar的选项顺序,因为-f之后的内容是您要保存的文件。此外,-p选项仅在从tar中提取文件时才有用。创建(-c)tar时,始终会保存权限。

其他人可能希望注意stat命令的这种用法在GNU / Linux中有效,但不适用于FreeBSD或Mac OSX等其他unices。在BSD中,您使用stat -f%z $mybackupname

答案 1 :(得分:3)

您拥有的文件重定向仅记录mv的输出。

你可以做到

{ tar ... && mv ... ; } > logfile 2>&1

捕获两者的输出,以及可能发生的任何错误。

总是养成在扩展时引用变量的习惯是个好主意。

不需要exit