在 Linux 使用 cron 定时执行任务的注意事项

在 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的时间长点更保险。

相关推荐
ulias2121 小时前
Linux系统中的权限问题
linux·运维·服务器
青花瓷3 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
mzhan0173 小时前
Linux: lock: preempt_count 是一个线程级别的变量
linux·lock
问简3 小时前
docker 镜像相关
运维·docker·容器
Dream of maid4 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾4 小时前
统信系统UOS常用命令集
linux·运维·服务器
Benszen4 小时前
Docker容器化技术实战指南
运维·docker·容器
ZzzZZzzzZZZzzzz…4 小时前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
一叶知秋yyds6 小时前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
专吃海绵宝宝菠萝屋的派大星6 小时前
使用Dify对接自己开发的mcp
java·服务器·前端