本篇目标
一、为什么需要定时任务?
作为运维,你很快会发现很多工作都在重复:
刚开始服务器只有一台的时候,你可能觉得手动执行也没什么问题。
但随着业务增长:
服务器越来越多
↓
任务越来越多
↓
人工执行越来越容易遗漏
↓
最终出现事故
这时候就需要把这些重复工作交给系统自动完成。
这也是自动化运维的第一步。
二、什么是 Cron?
Linux 中最常见的定时任务服务叫:
Cron
它会一直在后台运行。
当时间满足设定条件时:
执行指定命令
↓
记录执行结果
↓
等待下一次执行
查看服务状态:
# Ubuntu / Debian
systemctl status cron
# CentOS / RHEL
systemctl status crond
启动服务:
# Ubuntu / Debian
systemctl start cron
# CentOS / RHEL
systemctl start crond
如果服务没有运行:
所有定时任务都不会执行
因此遇到问题时,第一步永远先检查 Cron 服务状态。
三、Crontab 基础命令
Crontab 用于管理当前用户的定时任务。
常用命令如下:
# 编辑定时任务
crontab -e
# 查看定时任务
crontab -l
# 删除所有定时任务(危险操作)
crontab -r
运维日常最常用的是:
crontab -e
因为绝大部分任务都是通过它来配置的。
四、Crontab 时间格式
一条定时任务通常长这样:
0 2 * * * /usr/local/bin/backup.sh
格式为:
分 时 日 月 周 命令
刚接触时不用死记。
记住几个最常见场景即可。
# 每小时执行一次
0 * * * * command
# 每天凌晨2点执行
0 2 * * * command
# 每5分钟执行一次
*/5 * * * * command
# 每周一凌晨3点执行
0 3 * * 1 command
# 每月1号执行
0 0 1 * * command
实际生产环境中:
每天执行
每小时执行
每5分钟执行
占了绝大多数场景。
五、第一个定时任务
先创建一个简单测试脚本:
#!/bin/bash
echo "$(date) cron test" >> /tmp/cron.log
保存为:
/tmp/test.sh
赋予执行权限:
chmod +x /tmp/test.sh
然后编辑 Crontab:
crontab -e
添加:
# 每分钟执行一次
* * * * * /tmp/test.sh
等待一分钟后查看:
cat /tmp/cron.log
如果看到类似内容:
Fri Jun 12 20:01:01 JST 2026 cron test
说明:
Cron 服务正常
↓
任务执行成功
六、为什么脚本手动能运行,定时任务却失败?
这是运维新人最容易踩的坑之一。
很多时候:
bash backup.sh
执行正常。
但放进 Crontab 后:
完全没有效果
通常是以下几个原因。
环境变量不同
Cron 的运行环境非常简单。
例如:
docker ps
手动执行正常。
Cron 中可能提示:
docker: command not found
解决方法:
# 查找命令完整路径
which docker
# 使用绝对路径
/usr/bin/docker ps
工作目录不同
很多脚本喜欢这样写:
./backup.sql
Cron 执行时可能找不到文件。
正确做法:
/backup/backup.sql
尽量使用绝对路径。
权限不足
检查:
ls -l script.sh
确保:
chmod +x script.sh
七、实战:数据库自动备份
上一篇我们已经编写了:
/usr/local/bin/mysql_backup.sh
现在只需要把它交给 Cron。
编辑任务:
crontab -e
添加:
# 每天凌晨2点备份数据库
0 2 * * * /usr/local/bin/mysql_backup.sh
为了方便排错,建议记录日志:
# 记录标准输出和错误输出
0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
八、实战:网站状态监控
需求:
每5分钟检查一次网站是否正常。
创建脚本:
#!/bin/bash
URL="https://example.com"
STATUS=$(curl -s \
-o /dev/null \
-w "%{http_code}" \
${URL})
if [ "$STATUS" != "200" ]; then
echo "$(date) 网站异常:${STATUS}" \
>> /var/log/web_check.log
fi
保存:
/usr/local/bin/check_web.sh
赋权:
chmod +x /usr/local/bin/check_web.sh
添加定时任务:
# 每5分钟检查一次
*/5 * * * * /usr/local/bin/check_web.sh
实现效果:
定时检查
↓
发现异常
↓
记录日志
这已经属于最基础的监控系统了。
九、如何查看 Cron 执行日志?
很多人遇到问题:
任务没执行
↓
不知道原因
其实 Cron 自己会记录日志。
查看相关日志:
# Ubuntu / Debian
grep CRON /var/log/syslog
# CentOS / RHEL
grep CROND /var/log/cron
实时查看:
# Ubuntu / Debian
tail -f /var/log/syslog
# CentOS / RHEL
tail -f /var/log/cron
记住一个原则:
排错先看日志,不要靠猜。
十一、定时任务最佳实践
生产环境建议遵循以下原则:
使用绝对路径
↓
脚本先手动测试
↓
重要任务记录日志
↓
定期检查执行结果
↓
不要把生产环境当测试环境
例如:
# 推荐
/usr/bin/docker ps
# 不推荐
docker ps
例如:
# 推荐
/backup/mysql.sql
# 不推荐
./mysql.sql
这些看似不起眼的小细节,往往能避免大量故障。
十一、本篇总结
从这一篇开始,我们已经不再只是会执行命令。
而是在逐步学会:
让服务器自动完成工作。
这也是运维从「手工操作」走向「自动化运维」的第一步。