Linux 定时任务 crontab 详解:让脚本每天自动执行
1. 前言
在 Linux 服务器中,经常需要定时执行任务,例如:
- 每天凌晨备份数据;
- 每小时清理临时文件;
- 每 5 分钟检查服务状态;
- 定时同步文件;
- 定时执行 Shell 脚本;
- 定期生成日志报表。
Linux 中最常用的定时任务工具之一就是 crontab。
本文重点讲解:
- crontab 是什么;
- crontab 时间表达式怎么写;
- 如何让脚本每天自动执行;
- crontab 日志怎么看;
- crontab 环境变量问题;
- 常见定时任务排查方法。
2. crontab 是什么
cron 是 Linux 中的定时任务服务。
crontab 是用于管理定时任务的命令。
简单理解:
cron:后台定时任务服务
crontab:编辑定时任务规则的工具
查看 cron 服务状态:
systemctl status cron
在某些系统中服务名可能是:
systemctl status crond
Ubuntu / Debian 常见:
cron
CentOS / RHEL 常见:
crond
3. crontab 常用命令
编辑当前用户定时任务:
crontab -e
查看当前用户定时任务:
crontab -l
删除当前用户所有定时任务:
crontab -r
编辑指定用户定时任务:
sudo crontab -u username -e
查看指定用户定时任务:
sudo crontab -u username -l
4. crontab 时间格式
crontab 一行任务格式:
分 时 日 月 周 命令
对应:
* * * * * command
| | | | |
| | | | └── 星期,0-7,0 和 7 都表示周日
| | | └──── 月,1-12
| | └────── 日,1-31
| └──────── 小时,0-23
└────────── 分钟,0-59
示例:
0 2 * * * /bin/bash /opt/scripts/backup.sh
表示每天凌晨 2 点执行备份脚本。
5. 常见时间表达式
| 表达式 | 含义 |
|---|---|
* * * * * |
每分钟执行 |
*/5 * * * * |
每 5 分钟执行 |
0 * * * * |
每小时整点执行 |
0 2 * * * |
每天 2 点执行 |
30 3 * * * |
每天 3:30 执行 |
0 3 * * 0 |
每周日 3 点执行 |
0 3 1 * * |
每月 1 号 3 点执行 |
0 9 * * 1-5 |
周一到周五 9 点执行 |
0 9,18 * * * |
每天 9 点和 18 点执行 |
6. 特殊写法
crontab 还支持一些特殊关键字:
| 写法 | 含义 |
|---|---|
@reboot |
系统启动时执行 |
@yearly |
每年执行一次 |
@monthly |
每月执行一次 |
@weekly |
每周执行一次 |
@daily |
每天执行一次 |
@hourly |
每小时执行一次 |
示例:
@reboot /bin/bash /opt/scripts/start_app.sh
表示系统启动时执行脚本。
7. 创建一个测试脚本
创建脚本目录:
mkdir -p /opt/scripts
创建脚本:
vim /opt/scripts/hello_cron.sh
内容:
#!/bin/bash
echo "$(date '+%F %T') hello crontab" >> /tmp/hello_cron.log
添加执行权限:
chmod +x /opt/scripts/hello_cron.sh
手动测试:
/bin/bash /opt/scripts/hello_cron.sh
cat /tmp/hello_cron.log
确认脚本能正常执行后,再配置 crontab。
8. 配置每分钟执行一次
编辑 crontab:
crontab -e
添加:
* * * * * /bin/bash /opt/scripts/hello_cron.sh
等待一分钟后查看:
tail -f /tmp/hello_cron.log
如果每分钟追加一行,说明 crontab 配置成功。
9. 让脚本每天自动执行
例如每天凌晨 2 点执行备份:
0 2 * * * /bin/bash /opt/scripts/backup.sh
如果想把输出写入日志:
0 2 * * * /bin/bash /opt/scripts/backup.sh >> /var/log/backup_cron.log 2>&1
这里:
>> /var/log/backup_cron.log 2>&1
表示标准输出和错误输出都追加写入日志文件。
10. crontab 的环境变量问题
crontab 执行任务时,环境变量通常比手动登录终端少。
所以脚本中容易出现:
command not found
原因是 PATH 不完整。
解决方法一:命令使用绝对路径。
查看命令路径:
which bash
which tar
which python3
在 crontab 中写:
0 2 * * * /bin/bash /opt/scripts/backup.sh
解决方法二:在脚本开头设置 PATH:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
11. crontab 中的工作目录问题
crontab 默认工作目录不一定是脚本所在目录。
所以脚本里不要依赖相对路径。
不推荐:
tar -czf backup.tar.gz ./data
推荐:
tar -czf /data/backup/backup.tar.gz /opt/app/data
或者在脚本开头切换目录:
cd /opt/app || exit 1
12. 查看 crontab 日志
Ubuntu / Debian 可以查看:
grep CRON /var/log/syslog
CentOS / RHEL 可以查看:
tail -f /var/log/cron
systemd 系统也可以用:
journalctl -u cron
或:
journalctl -u crond
如果任务没有执行,先看 cron 服务是否运行:
systemctl status cron
systemctl status crond
13. 系统级 crontab
除了用户自己的 crontab,还有系统级配置。
常见路径:
/etc/crontab
/etc/cron.d/
/etc/cron.daily/
/etc/cron.hourly/
/etc/cron.weekly/
/etc/cron.monthly/
查看:
cat /etc/crontab
系统级 crontab 通常多一列用户:
分 时 日 月 周 用户 命令
例如:
0 2 * * * root /bin/bash /opt/scripts/backup.sh
这表示以 root 用户执行。
14. crontab 和 systemd timer
现代 Linux 也可以使用 systemd timer 做定时任务。
不过 crontab 更简单,适合入门和常规脚本。
简单对比:
| 工具 | 特点 |
|---|---|
| crontab | 简单、传统、上手快 |
| systemd timer | 和 systemd 集成好,适合服务化管理 |
普通脚本定时执行,用 crontab 已经足够。
复杂服务调度可以考虑 systemd timer。
15. 常见定时任务案例
15.1 每天备份目录
0 2 * * * /bin/bash /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
15.2 每 10 分钟检查服务
*/10 * * * * /bin/bash /opt/scripts/check_service.sh >> /var/log/check_service.log 2>&1
15.3 每周清理临时文件
0 3 * * 0 /usr/bin/find /tmp -type f -mtime +7 -delete
15.4 开机启动脚本
@reboot /bin/bash /opt/scripts/start_app.sh >> /var/log/start_app.log 2>&1
16. 常见问题排查
16.1 脚本手动能执行,crontab 不执行
常见原因:
- crontab 没保存成功;
- cron 服务没启动;
- 脚本路径错误;
- 命令没有使用绝对路径;
- 环境变量缺失;
- 脚本没有执行权限;
- 相对路径导致文件找不到。
排查:
crontab -l
systemctl status cron
grep CRON /var/log/syslog
16.2 crontab 没有日志
给任务加输出重定向:
* * * * * /bin/bash /opt/scripts/test.sh >> /tmp/test_cron.log 2>&1
然后查看:
tail -f /tmp/test_cron.log
16.3 时间设置不对
查看系统时间:
date
timedatectl
查看时区:
timedatectl
设置时区:
sudo timedatectl set-timezone Asia/Shanghai
如果服务器时区不对,crontab 执行时间也会和预期不一致。
16.4 百分号问题
crontab 中 % 有特殊含义。
如果命令里直接写 date 格式:
* * * * * echo $(date +%F)
可能出问题。
建议把复杂命令写进脚本里。
crontab 中只调用脚本:
* * * * * /bin/bash /opt/scripts/task.sh
17. crontab 使用建议
建议:
复杂逻辑写脚本
crontab 只负责调度
脚本使用绝对路径
任务输出写日志
先手动执行脚本
再配置定时任务
不推荐在 crontab 中写很长的一行复杂命令。
否则后期维护和排查都很困难。
18. 小结
crontab 的核心是时间表达式:
分 时 日 月 周 命令
常用命令:
crontab -e
crontab -l
crontab -r
systemctl status cron
grep CRON /var/log/syslog
常见定时任务:
0 2 * * * /bin/bash /opt/scripts/backup.sh
*/5 * * * * /bin/bash /opt/scripts/check.sh
@reboot /bin/bash /opt/scripts/start.sh
掌握 crontab 后,就可以让 Shell 脚本自动运行,实现备份、清理、巡检、同步、报表生成等自动化任务。