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

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

相关文章

出门必备,科学背包指南
365体育怎么打不开了

出门必备,科学背包指南

📅 11-02 👁️ 5629
移动流量包怎么买划算?教你5招省钱
365bet亚洲城

移动流量包怎么买划算?教你5招省钱

📅 06-29 👁️ 1797
夏季防蚊怎麼做最有效?5個天然防蚊法讓你全家安心一夏
365直播电视版下载

夏季防蚊怎麼做最有效?5個天然防蚊法讓你全家安心一夏

📅 09-13 👁️ 8264