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"
如果您想保留调试信息(例如tar
or的 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
.