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

相关推荐
AI小小怪3 小时前
在Linux服务器上安装CVAT (Docker 28.5.1)
运维·docker·容器·数据标注·cvat
KYGALYX6 小时前
在Linux中备份msyql数据库和表的详细操作
linux·运维·数据库
余—笙6 小时前
Linux(docker)安装搭建CuteHttpFileServer/chfs文件共享服务器
linux·服务器·docker
lang201509286 小时前
Linux高效备份:tar与gzip完全指南
linux·运维·服务器
IDOlaoluo7 小时前
OceanBase all-in-one 4.2.0.0 安装教程(CentOS 7/EL7 一键部署详细步骤)
linux·centos·oceanbase
wanhengidc7 小时前
云手机的基本原理
运维·服务器·游戏·智能手机·云计算
篙芷7 小时前
两台服务器 NFS 共享目录实战
运维·服务器
catoop8 小时前
在 WSL 的 Ubuntu 中安装和配置 SSH 服务
linux·ubuntu·ssh
Hard but lovely8 小时前
linux: centos 软件包管理 yum源
linux·运维·centos
悲伤小伞8 小时前
Linux_Socket_UDP
linux·服务器·网络·c++·网络协议·udp