Rclone备份脚本CronJob未包含新增子文件夹问题求助
排查Cron下Rclone备份遗漏新增子文件夹的问题
碰到过不少Cron和Rclone搭配的坑,你的问题核心在于Cron的执行环境和手动登录的Shell环境完全不一样——哪怕你配置了PATH,还有一堆隐藏细节会影响备份结果。下面是几个我亲测有效的排查方向和解决建议:
1. 把所有路径改成绝对路径,别依赖环境变量
手动执行时,你的Shell会自动帮你解析相对路径、默认配置文件位置,但Cron的“脑子”没这么灵活:
- 调用Rclone时用绝对路径,比如
/usr/bin/rclone sync,而不是只写rclone(哪怕你在Cron里加了PATH,有时候还是会出问题) - 备份源目录、Rclone配置文件都用绝对路径,比如
--config /home/yourname/.config/rclone/rclone.conf,别指望Cron能找到默认的配置文件位置 - 脚本里如果有切换目录的操作,也用绝对路径,比如
cd /var/www/wordpress而不是cd wordpress
2. 检查Cron的环境变量是否缺胳膊少腿
除了PATH,HOME、USER这些变量也会影响Rclone的行为。你可以先让Cron输出它的环境变量看看:
* * * * * env > /tmp/cron_env_dump.txt
然后对比你手动执行env > /tmp/shell_env_dump.txt的结果,把缺失的关键变量加到脚本开头,比如:
#!/bin/bash export HOME=/home/yourname export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 要是Rclone还有其他依赖的变量,也一起加上
3. 权限!权限!权限!(重要的事说三遍)
手动执行时你是当前登录用户,权限拉满,但Cron默认用当前用户执行(除非你指定了其他用户):
- 新增的子文件夹权限是不是允许Cron用户读取?比如文件夹是
700权限但属于root,那Cron肯定访问不到 - 给Rclone加日志参数,比如
--log-file /tmp/rclone_backup.log --log-level INFO,然后去日志里找有没有“permission denied”或者“directory not found”的报错,这往往是权限问题的直接线索
4. 检查Rclone的过滤规则是不是写死了
如果你的脚本里用了--include、--exclude这类过滤规则,有没有可能只写了旧文件夹,没包含新增的?比如:
# 错误示例:只同步固定的几个旧文件夹 rclone sync /source/wp-content/uploads /dest/backup --include "folder1/**" --include "folder2/**"
改成更通用的规则,比如同步所有子文件夹:
# 正确示例:同步uploads下所有内容 rclone sync /source/wp-content/uploads /dest/backup # 要是需要过滤文件类型,就用后缀匹配,比如只同步图片 rclone sync /source/wp-content/uploads /dest/backup --include "**/*.{jpg,png,webp}"
5. 强制脚本切换到正确的工作目录
如果脚本里有基于当前目录的操作,Cron默认的工作目录(一般是用户主目录)不对会导致路径混乱。在脚本开头加一行,强制切换到脚本所在的目录:
#!/bin/bash # 切换到脚本所在目录,失败就退出 cd "$(dirname "$0")" || exit 1 # 后面的备份命令
6. 模拟Cron环境手动测试脚本
直接用Cron的环境变量来执行脚本,这样能复现问题,更容易定位:
# 用Cron的环境模拟执行脚本 env -i PATH=/usr/bin:/bin HOME=/home/yourname USER=yourname bash /path/to/your/backup.sh
如果这样执行也出现遗漏子文件夹的问题,那你就能在手动环境下调试脚本了,比等Cron跑一次方便多了。
内容的提问来源于stack exchange,提问作者Peter Schümann
相关产品推荐
相关产品推荐

