数码工坊
白蓝主题五 · 清爽阅读
首页  > 数据备份

备份脚本里的时间判断:用条件语句自动跳过非工作时间

上周帮朋友修电脑,发现他每天凌晨3点还在执行全盘备份——硬盘咔咔响,风扇狂转,人却在睡觉。问他为啥不调个时间,他说:"脚本里写死了,一到整点就跑,管它白天黑夜。"

时间不是摆设,是备份逻辑的一部分

数据备份不是越勤快越好,而是越合适越好。深夜备份可能拖慢系统响应,占用带宽;节假日备份可能错过关键业务窗口;而周一早上9点,恰恰是大家刚打开电脑、文件最齐整的时候。

这时候,条件语句 + 时间判断,就是让脚本“长脑子”的第一步。

Shell 脚本里怎么判时间?

比如这个小片段,只在工作日 9:00–18:00 执行备份:

if [ $(date +\%u) -ge 1 ] && [ $(date +\%u) -le 5 ]; then
hour=$(date +\%H)
if [ $hour -ge 9 ] && [ $hour -lt 18 ]; then
/usr/bin/rsync -av /home/user/docs/ /backup/usb/
fi
fi

其中 %u 返回星期几(1=周一,7=周日),%H 是24小时制小时数。两个条件嵌套,就锁定了“工作日上班时段”。

Python 备份脚本更灵活

如果你用 Python 写备份工具,datetime 和 if 组合起来更直观:

from datetime import datetime

now = datetime.now()
if now.weekday() < 5: # 周一到周五(0-4)
if 9 <= now.hour < 18:
run_backup('/home/user/project', '/backup/cloud/')
print(f"[{now}] 已执行增量备份")

甚至可以加一行:if now.month == 12 and now.day == 31:,专为跨年归档留个后门。

别忘了时区和夏令时

服务器在东京,你人在成都,date 输出的却是 UTC 时间?备份计划就全乱了。建议统一用 timedatectl set-timezone Asia/Shanghai 固定本地时区,或者在脚本开头显式指定:

export TZ='Asia/Shanghai'
hour=$(TZ='Asia/Shanghai' date +\%H)

夏令时虽然国内不用,但若备份目标在欧美云服务上,读取对方时间戳时就得小心处理。

真实场景:自动跳过会议高峰

有位设计师同事把备份安排在每天 14:00,结果总卡在腾讯会议高峰期——网速掉一半,上传失败。后来改成:

# 跳过每天 13:55–14:05 这十分钟
min=$(date +\%M)
if [ $(date +\%H) = "14" ] && [ $min -ge 55 ] || [ $min -lt 5 ]; then
echo "会议时间,暂缓备份"
exit 0
fi
do_backup

小改动,大不同。

条件语句不是炫技,是让备份真正贴着人的节奏走。时间判断写对了,硬盘少喘两口气,你也少看一次失败日志。