当前位置:首页>Linux>Linux 基础:定时任务详解

Linux 基础:定时任务详解

  • 2026-09-03 08:29:11
Linux 基础:定时任务详解

在 Linux 系统中,我们经常需要让某些任务在特定时间自动执行,比如每天凌晨备份数据库、每小时清理日志、每周同步文件等。这类需求可以通过 定时任务(Cron Job) 来实现。

本文将带你全面了解 Linux 中最常用的定时任务工具 —— cron,从基础语法到实战配置,助你轻松掌握自动化运维的核心技能。

一、什么是 Cron?

Cron 是 Linux/Unix 系统中用于周期性执行任务的守护进程(daemon)。它读取配置文件(称为 crontab),按照设定的时间规则触发指定的命令或脚本。

  • 后台服务名:crond
  • 配置文件:每个用户可拥有自己的 crontab 文件
  • 默认位置:/var/spool/cron/用户名(不同发行版可能略有差异)
“

✅ 几乎所有 Linux 发行版都默认安装并启用了 cron 服务。

二、Crontab 语法详解

一条完整的定时任务由 6 个字段 组成(前 5 个是时间规则,第 6 个是命令):

分 时 日 月 周 命令
字段
取值范围
含义
分(Minute)
0–59
每小时的第几分钟
时(Hour)
0–23
每天的第几小时(24 小时制)
日(Day of month)
1–31
每月的第几天
月(Month)
1–12
每年的第几个月
周(Day of week)
0–7(0 和 7 都表示周日)
每周的星期几
命令
-
要执行的 Shell 命令或脚本

特殊符号说明:

符号
含义
示例
*
任意值
*
 在“分”字段表示每分钟
,
枚举多个值
1,3,5
 表示 1、3、5
-
范围
1-5
 表示 1 到 5
/
步长
*/10
 表示每隔 10(如每 10 分钟)

三、常用时间表达式示例

# 分钟
* * * * * command  # 每1分钟执行
*/5 * * * * command # 每5分钟执行

#
 小时
0 * * * * command   # 每小时执行
5 * * * * command    # 每小时的第5分钟
1,50 * * * * command # 每小时的第1分钟和第50分钟执行

#
 天
0 0 * * * command    # 每天执行
0 1 * * * command     # 每天凌晨1点执行
0 2 * * * command     # 每天凌晨 2 点执行
30 4 * * * command    # 每天的 4:30
25 8-11 * * * command # 每天 8~11点 的第 25 分钟执行
0 8 * * 1-5 command   # 工作日(周一至周五)每早 8 点

#
 月
20 7 8 * * command     # 每月 8号 的 7:20 执行
30 4 10,20 * * command # 每月 10号和20号 的 4:30 执行
30 5 */10 * * command  # 每个月中每隔 10天 的 5:30 执行
0 12 1,15 * * command  # 每月 1 号和 15 号中午 12 点

#
 星期
0 0 * * 0 command  # 每周执行
0 9 * * 1 command   # 每周一上午 9 点执行
30 6 * * 0 command  # 每星期日的 6:30 执行

#
 其他
0 0 1 1 * command  # 每年执行
30 5 28 6 * command # 每年的 6月28号 5:30 执行
1,50 21-23 * * * command # 在21点到23点的第1和第50分钟执行
1,50 21-23 */2 * * command # 每隔两天在21点到23点的第1和第50分钟执行
30 4 * * * root run-parts /etc/cron.daily # 每天 4:30 以 root 身份执行 /etc/cron.daily 目录中的所有可执行文件
“

⚠️ 注意:“日”和“周”字段是“或”的关系。例如 0 0 1 * 0 表示“每月 1 号 或 每周日”都会执行。

四、如何管理 Crontab?

编辑当前用户的定时任务

crontab -e
“

首次使用会提示选择编辑器(如 vim、nano)。

查看当前用户的定时任务

crontab -l

删除所有定时任务

crontab -r
“

⚠️ 谨慎使用!无法恢复。

为其他用户设置(需 root 权限)

crontab -u username -e

其他命令

# 服务状态
systemctl status crond
# 服务开启
systemctl start crond
# 服务关闭
systemctl stop crond
# 服务重启
systemctl restart crond
# 重新加载
systemctl reload crond

五、示例

示例1:创建一个每日备份任务

假设我们要每天凌晨 1:30 备份 MySQL 数据库,并记录日志:

30 1 * * * /opt/scripts/backup_db.sh >> /var/log/backup.log 2>&1

其中:

  • backup_db.sh 是自定义备份脚本
  • >> /var/log/backup.log 将标准输出追加到日志
  • 2>&1 将错误信息也写入日志(便于排查)
“

✅ 建议:确保脚本有执行权限(chmod +x backup_db.sh),且路径使用绝对路径!

示例2:每分钟输出当前时间到txt

crontab -e 开始编写,或者去/var/spool/cron/root下编写

* * * * * echo -e "$(date)" >> /log_crontab.txt

示例3:其他示例

# 定时每日凌晨1点清空 nohup.out日志
0 1 * * * find / -name "nohup.out" -exec rm -rf {} \;

#
 设置定时备份gitlab
0 1,13 * * * gitlab-rake gitlab:backup:create

#
 定时每日凌晨1点清空 2天前的备份记录 例如8月4日清空 8月2日之前的 包含8月1日 不包含8月2日
0 1 * * * find /home/work/docker_md/gitlab/data/backups -mtime +2 -name "*_gitlab_backup.tar" -exec rm -rf {} \;

六、常见问题与注意事项

环境变量问题

Cron 执行时的环境变量非常有限(如 PATH 可能不包含 /usr/local/bin)。
解决方案:

  • 在脚本开头显式设置环境,如:
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  • 或在 crontab 中定义变量:
PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * /your/script.sh

百分号(%)转义问题

在 crontab 中,% 有特殊含义(表示换行),若命令中包含 %(如 date +%Y%m%d),必须用反斜杠转义:

0 0 * * * /bin/touch /tmp/file_$(date +\%Y\%m\%d).txt

邮件通知

默认情况下,cron 会将命令的输出通过邮件发送给用户(使用 mail 命令)。
如果不希望收到邮件,可重定向输出到 /dev/null:

0 3 * * * /script.sh > /dev/null 2>&1

系统级定时任务

除了用户 crontab,还有系统级任务:

  • /etc/crontab:主配置文件(支持指定运行用户)
  • /etc/cron.d/:存放额外的 cron 配置文件(常用于软件包)
  • /etc/cron.hourly/, /etc/cron.daily/ 等:按周期自动执行目录中的脚本

配置系统级别还是用户级别的定时任务?

Linux系统中的定时任务(cron jobs)可以配置在系统级别或用户级别。选择配置哪个级别取决于任务的需求和执行环境。

  • 系统级别的定时任务通常由系统管理员配置,用于执行对整个系统或多个用户共享的任务。这些任务通常是系统维护、监控、日志切割等任务,需要以特权用户身份运行。系统级别的定时任务通常在 /etc/crontab 文件中配置,也可以在 /etc/cron.d/ 目录下的文件中配置。
  • 用户级别的定时任务由各个用户自行配置,用于执行与单个用户相关的任务,如备份个人数据、发送提醒等。这些任务以普通用户的身份运行,不需要额外的特权。用户级别的定时任务通过每个用户的 crontab 文件进行配置,使用 crontab -e 命令编辑。
“

通常情况下,对于单个用户的日常任务,推荐使用用户级别的定时任务。对于需要执行系统级操作或跨多个用户的共享任务,可以考虑使用系统级别的定时任务。在选择配置哪个级别的定时任务时,需要考虑任务的性质、执行环境和所需的权限。

七、替代方案

虽然 cron 是主流,但在现代系统中也有其他选择:

  • systemd timers:适用于使用 systemd 的系统(如 CentOS 7+、Ubuntu 16.04+),更灵活。
  • at:用于执行一次性任务(如 at now + 1 hour)。
  • anacron:适合不常开机的设备(如笔记本),确保错过任务仍能补执行。

八、总结

  • ✅ Cron 是 Linux 自动化运维的基石。
  • ✅ 掌握 crontab -e 和时间表达式是关键。
  • ✅ 注意路径、权限、环境变量和日志记录。
  • ✅ 定期检查日志(如 tail -f /var/log/cron)可快速定位问题。
“

🌟 小技巧:不确定时间表达式是否正确?可用在线工具 https://crontab.guru 快速验证!

最新文章

随机文章