3

我想备份我的 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

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

4

2 回答 2

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"

如果您想保留调试信息(例如taror的 stderr mv),可以通过重定向到 tmpfile 或调试文件来处理。但是,如果命令是通过 cron 运行并且有输出,那么 cron 应该通过电子邮件将其发送给您。静默 cron 作业是成功的 cron 作业。

if只要前一个程序成功,这一系列s 就会导致每个程序运行。这就像用 链接你的命令&&,但是让你在失败的情况下运行其他代码。

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

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

于 2012-07-13T11:20:34.433 回答
3

您拥有的文件重定向只会记录mv.

你可以做

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

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

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

没有必要exit

于 2012-07-13T09:43:39.293 回答