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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐