我想备份我的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
在我运行之前我应该知道什么?
答案 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"
如果您想保留调试信息(如tar
或mv
的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
。