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 脚本自动运行,实现备份、清理、巡检、同步、报表生成等自动化任务。