Linux 定时任务 crontab 详解:让脚本每天自动执行

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

相关推荐
jcbut1 小时前
在Linux 7.9上安装NetBackup IT Analytics (ITA) 11.2
linux·运维·netbackup·it analytics·ita
Geoking.1 小时前
SSH 一断 Node 服务就挂?排查与解决方案记录
运维·node.js·ssh
武器大师721 小时前
实战踩坑:Gerrit HTTP 克隆失败解决方案
运维·nginx·gerrit
云川之下1 小时前
【linux】免密登录
linux·免密
kaka❷❷1 小时前
Linux 内核、.ko、.so 与 SDK 镜像打包
linux·运维·服务器
微风◝2 小时前
【Linux故障排查】系统启动进入紧急模式:由磁盘挂载超时引发的服务器无法启动
linux·运维·服务器
闲猫2 小时前
堡垒机Linux黑屏识别命令Set -n探索可能性
linux·运维·服务器
寺中人2 小时前
基于Linux实现SSH密钥免密登录完整实战教程(CentOS/Ubuntu通用)
linux·ssh·免密登录·服务器运维·ssh-keygen
lilihuigz2 小时前
从“拥有AEO工具”到“拥有AEO代理”:三层架构解决营销自动化瓶颈 - 易服客工作室
运维·自动化