linux定时任务详细说明

Linux 系统提供了多种定时任务管理工具,最常用的是 Cronsystemd Timer。以下是详细用法指南:


一、Cron:经典定时任务工具

Cron 是 Linux 中用于周期性执行任务的守护进程,通过编辑 crontab 文件配置任务。

1. 基本用法

  • 编辑用户级定时任务
    1
    crontab -e  # 编辑当前用户的定时任务
  • 查看任务列表
    1
    crontab -l  # 列出当前用户的定时任务
  • 删除所有任务
    1
    crontab -r

2. Crontab 文件格式

1
2
# 格式:分钟 小时 日期 月份 星期 命令
* * * * * command-to-execute
  • 字段说明

    字段 取值范围 说明
    分钟 0-59 每小时的第几分钟执行
    小时 0-23 每天的第几小时执行
    日期 1-31 每月的第几天执行
    月份 1-12 每年的第几月执行
    星期 0-7 (0和7均为周日) 每周的周几执行
  • 特殊符号

    • *:匹配所有值。
    • ,:指定多个值(如 1,3,5)。
    • -:指定范围(如 1-5)。
    • /:间隔频率(如 */5 表示每5分钟)。

3. 示例

1
2
3
4
5
6
7
8
9
10
11
# 每天凌晨2点执行脚本
0 2 * * * /path/to/script.sh

# 每5分钟执行一次
*/5 * * * * /path/to/command

# 每周一至周五的上午10:30执行
30 10 * * 1-5 /path/to/job

# 使用环境变量和输出重定向
* * * * * PATH=/usr/local/bin:$PATH && /path/to/command > /var/log/cron.log 2>&1

4. 系统级定时任务

  • 文件位置
    • /etc/crontab:系统全局任务(需指定用户)。
    • /etc/cron.d/:存放自定义任务文件。
    • /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/:按周期执行的脚本目录。

5. 日志与调试

  • 查看 Cron 日志
    1
    2
    grep CRON /var/log/syslog      # Debian/Ubuntu
    grep CRON /var/log/cron # RedHat/CentOS

二、Anacron:适用于非24小时运行的系统

Anacron 用于在系统未持续运行时执行错过周期的任务(如笔记本电脑)。

1. 配置文件

  • 编辑 /etc/anacrontab
    1
    2
    # 格式:周期天数 延迟时间 任务名称 命令
    1 5 daily-job /path/to/daily-script.sh

2. 运行机制

  • 任务记录在 /var/spool/anacron/ 目录中。
  • 适合每日、每周等低频任务。

三、systemd Timer:替代 Cron 的现代方案

systemd Timer 通过 .timer.service 单元文件管理定时任务,适合复杂调度。

1. 创建 Service 文件

  • 编写服务单元 /etc/systemd/system/my-job.service
    1
    2
    3
    4
    5
    [Unit]
    Description=My Custom Job

    [Service]
    ExecStart=/path/to/script.sh

2. 创建 Timer 文件

  • 编写定时器单元 /etc/systemd/system/my-job.timer
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Unit]
    Description=Run my job daily

    [Timer]
    OnCalendar=*-*-* 02:00:00 # 每天凌晨2点
    Persistent=true # 如果错过时间,开机后立即执行

    [Install]
    WantedBy=timers.target

3. 启用并启动 Timer

1
2
3
systemctl daemon-reload
systemctl enable my-job.timer
systemctl start my-job.timer

4. 常用命令

  • 查看 Timer 状态:
    1
    2
    systemctl list-timers
    systemctl status my-job.timer

5. 时间格式(OnCalendar)

  • 使用 OnCalendar 表达式:
    1
    2
    3
    OnCalendar=Mon,Fri *-*-* 10:30:00  # 每周一和周五10:30
    OnCalendar=*-*-* 00/3:00:00 # 每3小时
    OnCalendar=daily # 每天00:00:00

四、Cron 与 systemd Timer 对比

特性 Cron systemd Timer
依赖服务 cron 守护进程 systemd
配置方式 文本文件 (crontab) 单元文件 (.timer, .service)
灵活性 简单定时 支持复杂调度和依赖关系
日志管理 需手动处理输出 集成 Journal 日志
适用场景 简单周期性任务 复杂任务或需系统集成

五、常见问题

  1. 任务未执行

    • 检查命令路径是否完整(使用绝对路径)。
    • 检查权限(脚本是否可执行)。
    • 查看日志:journalctl -u my-job.service(systemd)或 /var/log/cron(Cron)。
  2. 环境变量问题

    • Cron 默认环境与用户环境不同,建议在脚本中设置 PATH 或使用完整路径。
  3. 输出处理

    • 重定向输出到文件:*/5 * * * * /path/to/command >> /var/log/command.log 2>&1
    • 禁用邮件通知:MAILTO=""

通过上述方法,您可以灵活管理 Linux 系统中的定时任务。对于简单任务推荐使用 Cron,复杂或需系统集成的任务可选用 systemd Timer。