利用脚本与LaunchAgent自定义Time Machine备份时机
原本我设置了每小时自动备份,但因为一直开着 ZeroTier 并与家里路由器打通,结果在公司也会自动进行备份,网络速度极其缓慢,还长时间占用带宽。想通过自定义时间来控制备份,但默认选项并不支持。于是我打算写个脚本自动运行,最初想通过判断当前的 Wi-Fi 网络来识别环境,但发现 wdutil 需要 sudo 权限才能执行,操作较为麻烦。最终只能改用“时间 + IP 段”的方式来控制备份,设置成一个不常用的 IP 段,避免误触发。这样既能保留自动化,又能在公司网络环境下避免被动触发大流量的备份操作。
首先把Time Mechine设置为手动,然后新建一个timemechine.sh,内容如下
#!/bin/zsh
# 如果你更习惯 bash,就把 #!/bin/zsh 改成 #!/bin/bash
# 1) 获取 en0 接口的 IP
# 如果你的网络接口不是 en0,可以改成 en1、en6 等实际接口名
IP=$(ipconfig getifaddr en0)
# 2) 获取当前时间,格式为 HHMM,例如 18:41 => 1841
CURRENT_TIME=$(date +%H%M)
# --- (可选)先检测 Time Machine 是否正在备份中 ---
backup_status=$(tmutil status | grep "Running = 1;")
if [ -n "$backup_status" ]; then
echo "Time Machine 备份已在进行中,跳过此次触发。"
exit 0
fi
# 3) 判断 IP 是否在 192.168.50.* 网段
if [[ "$IP" == 192.168.50.* ]]; then
# 4) 判断时间是否在 18:40 (1840) 到 21:20 (2120) 之间
if [ "$CURRENT_TIME" -ge 1840 ] && [ "$CURRENT_TIME" -lt 2120 ]; then
echo "当前 IP 在 192.168.50.x 网段,且时间处于 18:40~21:20,开始执行 Time Machine 备份..."
# 5) 开始 Time Machine 备份
tmutil startbackup
# 如果你想指定目标卷,可用:
# tmutil startbackup --destination /Volumes/你的备份卷
else
echo "当前 IP 在 192.168.50.x 网段,但时间不在 18:40~21:20 之间,不执行备份。"
fi
else
echo "IP 不在 192.168.50.x 网段,不执行备份。"
fi
然后加上执行权限
chmod +x timemechine.sh
添加一个配置文件
vi ~/Library/LaunchAgents/com.example.autobackup.plist
文件内容如下(自行修改timemechine.sh文件路径)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 一个随意命名的标签 -->
<key>Label</key>
<string>com.example.autobackup</string>
<!-- 要执行的脚本文件路径 -->
<key>ProgramArguments</key>
<array>
<string>/Users/danfi/script/timemechine.sh</string>
</array>
<!-- 每隔 X 秒执行一次,这里是 300 秒=5分钟 -->
<key>StartInterval</key>
<integer>300</integer>
<!-- 如果需要,你也可指定 RunAtLoad 在加载时就执行一次
<key>RunAtLoad</key>
<true/>
-->
</dict>
</plist>
确保配置文件的拥有者和权限正确
chown danfi:staff ~/Library/LaunchAgents/com.example.autobackup.plist
chmod 644 ~/Library/LaunchAgents/com.example.autobackup.plist
这样,定时任务就会按照 StartInterval(此处为 5 分钟)周期运行指定的脚本 ,周期可以自行定义。
使用 launchctl 命令将这个配置加载到当前用户的进程中:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.autobackup.plist
至此,脚本就会每5分钟判断当前时间以及IP是否在有效范围内,然后执行备份。
评论
发表评论