我有一个小的备份 bash 脚本,是我在工作时为我的计算机编写的。我已将脚本复制到/etc/rc0.d/
并调用它K01backup
,以便在关闭时先执行它。它将我的计算机(运行 Ubuntu 14.04LTS)、工作副本以及位于单独内部 SSD 上的虚拟机中的所有数据备份到外部硬盘驱动器,并将日志输出添加到每个文件夹中的文件中。
这是脚本:
#!/bin/bash
LOG="/syncLog"
VMORIG="/media/SSDData/VM"
PROJORIG="/media/Data/Projects"
DESTROOT="/media/ExtData/Backups"
LOGVM=${DESTROOT}"/VM"${LOG}
LOGPROJ=${DESTROOT}"/Projects"${LOG}
ALLORIG="/"
DESTALL=${DESTROOT}"/All"
LOGALL=${DESTROOT}"/All"${LOG}
echo "STARTED" > ${LOGPROJ}
date +%d.%m.%Y/%H:%M:%S >> ${LOGPROJ}
rsync -avvx --progress --no-whole-file ${PROJORIG} ${DESTROOT} >> ${LOGPROJ}
echo "FINISHED" >> ${LOGPROJ}
date +%d.%m.%Y/%H:%M:%S >> ${LOGPROJ}
echo "STARTED" > ${LOGVM}
date +%d.%m.%Y/%H:%M:%S >> ${LOGVM}
rsync -avvx --progress --no-whole-file ${VMORIG} ${DESTROOT} >> ${LOGVM}
echo "FINISHED" >> ${LOGVM}
date +%d.%m.%Y/%H:%M:%S >> ${LOGVM}
echo "STARTED" > ${LOGALL}
date +%d.%m.%Y/%H:%M:%S >> ${LOGALL}
rsync -avvx --progress --no-whole-file --exclude "/media/*" --exclude "/indel/*" ${ALLORIG} ${DESTALL} >> ${LOGALL}
echo "FINISHED" >> ${LOGALL}
date +%d.%m.%Y/%H:%M:%S >> ${LOGALL}
然后我跑去sudo chmod +x /etc/rc0.d/K01backup
让它可执行。起初,脚本大约花了一个小时来执行,一切都很顺利。但现在,我可以在日志文件中看到脚本已启动(大概是又开始了)在我下班一小时后,所有文件都已经是最新的,所以运行只花了大约一分钟。
有谁知道我可能做错了什么?
答案1
该目录中的自述文件指出该目录中的脚本仅在断电时调用一次(而不是在重新启动时调用)。
用一个简单的测试程序
#!/bin/bash
LOG=/root/backup.log
date >> $LOG
echo $* >> $LOG
我注意到有一次该程序实际上被调用了两次,一次没有参数,一次带有参数“stop”。然而我无法重现它。
我建议将实际的调用参数也记录到程序中,并$1
记录在脚本测试中stop
。
更习惯的做法是将此程序放入backup
并/etc/init.d
建立到该脚本的链接/etc/rc0.d/K01backup
,但这不应以任何方式影响其操作。任何管理此类条目的工具都可以创建/删除这些链接。
基于尝试这个基本脚本,OP 发现有一个来自编辑文件的备份文件:/etc/rc0.d/K01backup~
它也被执行了。从一开始就将backup
文件放入/etc/init.d/
并建立链接可以防止这种情况发生(无论是否存在文件/etc/init.d/backup~
)。