在 Linux 下想通过 cron 设置自动镜像备份文件,遇到很多挫折,最后成功,记录下几点注意事项。
尝试过程:
系统默认自带 cron,执行 crontab -e 添加开机启动任务。类似如下语句。
@reboot rsync -a --delete /home/user/dir1 /home/user/backup
重启后发现没有效果。
按照有的网友指导的方法,可能是 cron 不适合直接执行非内置的命令,我又写了个脚本,通过脚本来运行。脚本内容如下。
#! /usr/bin/bash
rsync -a --delete /home/user/dir1 /home/user/backup
重启后还是没有效果。
按照有的网友指导的方法,可能 cron 执行的太快,有些环境还没初始化好,我在脚本里又加上了 sleep,运行前暂停20秒钟(10秒钟都不行)。
#! /usr/bin/bash
sleep 20
rsync -a --delete /home/user/dir1 /home/user/backup
重启后仍然没有效果。
后来在这篇文章的启发下,终于解决了问题。
检查 cron 是否在 Linux 上运行的 4 种方法 (linux-console.net)
排查1:
检查 cron 守护进程是否正常运行
sudo systemctl status cron
结果显示正常
排查2:
查看 cron 日志(发挥了关键作用)
grep CRON /var/log/syslog (默认是syslog,如果设置了 cron 单独日志,也可能是 cron)
通过日志能够确定 cron 在开机时确实执行了。
通过观察执行语句,我发现中文都显示成 \351\225 这样的格式,一度担心是不是路径文件名中有中文造成的问题,但经过测试,并非这个原因。
排查3:
按照参考文章里的方法3,证明 cron 在一般定时的情况下是可以正常运行的,但就是开机还不行。
检查 cron 是否在 Linux 上运行的 4 种方法 (linux-console.net)
排查4:
再次查看 cron 日志,这次才发现,@reboot 后面指定的路径是 /home/user \351\225......,中间少了一个 / ,多了一个空格,重新修改路径,但开机还是不行。
排查5:
把 rsync 改成 echo 命令,就可以正常运行,说明触发脚本执行没有问题,于是我尝试把之前去掉的 sleep 又加进来,这次终于正常运行了。
总结:
1.确保 cron 正常安装,正常运行。
2.使用 crontab -e 添加定时任务时,如果使用的是非内置命令,需要使用脚本,要确保脚本路径准确,具有执行权限。
3.使用非内置命令时,脚本里要添加 sleep 语句,延迟执行,sleep的时间长点更保险。