Zenith Horizon

Linux cron 定时任务指南

2026/03/20
loading

在 Debian 系统中,cron 是一个后台守护程序,用于在指定的时间自动执行预定的任务(如脚本或命令)。

它的核心运作机制如下:

  • ​开机自启​:cron 在系统启动时自动运行,之后每分钟“醒来”一次,检查所有任务配置文件。

  • ​读取配置​:它会检查 /var/spool/cron/crontabs/​ 目录下每个用户的个人任务文件,以及系统级的 /etc/crontab​ 文件和 /etc/cron.d/​ 目录。

  • ​执行任务​:一旦发现某个任务的时间条件满足,cron 就会以任务所有者的身份执行该命令。

cron 会监控上述文件和目录的修改时间,因此你编辑完任务后,无需重启服务即可生效。

1. 自定义定时任务的具体操作方法

在 Debian 中,你可以通过用户级或系统级两种方式创建任务。

1.1 用户级 crontab (推荐个人使用)

编辑当前登录用户的个人任务列表(通常用于备份、下载等个人脚本):

bash

crontab -e

如果是首次运行,系统会提示你选择一个编辑器(如 nano)。每个用户在 /var/spool/cron/crontabs/​ 下都有自己的配置文件。

1.2 系统级 crontab (需 root 权限)

用于定义整个系统的例行任务,格式上比用户级​多了一个指定用户的字段​。

  • ​编辑主配置文件​:
    bash

    sudo nano /etc/crontab
    
  • ​或者,在 /etc/cron.d/​ 下创建新文件​(便于管理):
    bash

    sudo nano /etc/cron.d/my-backup
    

2. 任务格式详解

crontab 中的每一行代表一个任务,基本格式如下:

text

分钟 小时 日 月 星期  <要执行的命令>
# 系统级文件需额外指定用户: 分钟 小时 日 月 星期 用户名  <命令>

时间字段说明 :

  • ​分钟​:0​-59​

  • ​小时​:0​-23​

  • ​日​:1​-31​

  • ​月​:1​-12​

  • ​星期​:0​-7​(0​和7​都表示周日,也可用 mon​、tue​ 等英文缩写)

​常用特殊字符​:

  • ​*​:任意值(每...)

  • ​,​:列举多个值(如 1,5​ 表示第1和第5)

  • ​-​:范围(如 10-15​ 表示10到15)

  • ​/​:步长(如 */10​ 表示每10)

3. 操作示例

以下是在​用户级 crontab​(crontab -e​)中编写任务的例子 :

bash

# 每天凌晨 2:30 执行脚本
30 2 * * * /home/user/bin/backup.sh

# 每工作日(周一至周五)上午 9:00 发送提醒
0 9 * * 1-5 /home/user/bin/send_reminder.sh

# 每隔 2 小时运行一次监控脚本 (注意:此例运行路径为 /home/user/check.sh)
0 */2 * * * /home/user/check.sh

# 使用 @reboot 让任务在每次启动时运行一次
@reboot /usr/bin/dircproxy

如果是​系统级文件​(如 /etc/crontab​),需要在时间后加上用户名:
​30 2 * * * root /home/user/bin/backup.sh​

4. 管理维护与注意事项

  • ​查看现有任务​:crontab -l​

  • ​删除所有任务​:crontab -r​

  • ​查看执行日志​(用于调试):grep CRON /var/log/syslog​

  • ​脚本注意事项​:

    1. 在 crontab 中建议使用​命令的绝对路径​(如 /usr/bin/echo​ 而非 echo​),因为 cron 执行时的环境变量可能与终端不同。

    2. 脚本本身需要有执行权限:chmod +x script.sh​ 。

    3. 如果任务有输出,cron 会尝试发邮件给用户。若不想收到邮件,可将输出重定向到空或日志文件:0 3 * * * /script.sh > /dev/null 2>&1​ 。

  • ​关于 anacron​:如果你的电脑会不定时关机(如笔记本),Debian 还提供了 anacron​。它能确保本该在关机期间运行的任务,在下次开机时补上。系统级的每日任务(/etc/cron.daily/​)通常由它管理。

用途

命令

说明

编辑任务

​crontab -e​

编辑当前用户的任务列表

查看任务

​crontab -l​

列出当前用户的所有定时任务

删除任务

​crontab -r​

删除当前用户的整个任务列表

编辑系统任务

​sudo nano /etc/crontab​

编辑系统级主配置文件(需指定用户名)

查看日志

​grep CRON /var/log/syslog​

在系统日志中过滤 cron 的执行记录

5. cron 目录

在 Debian 系统中,/etc/​ 目录下的 cron.hourly​、cron.daily​、cron.weekly​、cron.monthly​ 以及 cron.d​ 文件夹是系统级定时任务的重要组成部分。它们利用了 run-parts​ 工具,让管理员可以更简单、更有组织地部署周期性脚本,而不必直接编辑 crontab 文件。

目录

用途

​/etc/cron.hourly/​

存放每小时执行一次的脚本

​/etc/cron.daily/​

存放每天执行一次的脚本

​/etc/cron.weekly/​

存放每周执行一次的脚本

​/etc/cron.monthly/​

存放每月执行一次的脚本

​/etc/cron.d/​

存放独立的、零散的 crontab 片段文件,格式与 /etc/crontab​ 相同(需指定用户)

这些目录是由主配置文件 /etc/crontab​ 中预置的条目驱动的。Debian 默认的 /etc/crontab​ 里通常包含以下几行:

# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 每小时的整点过后一分钟检查 /etc/cron.hourly/
1 * * * * root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.hourly )

# 每日、每周、每月任务则交给 anacron 处理(如果系统安装了 anacron)
# 如果没有 anacron,则会用类似上面的 run-parts 直接运行

​注意​:默认情况下,每日/每周/每月任务通常由 anacron​ 管理,以确保即使系统在计划时间关机,也能在下次开机后补执行。若没有 anacron​,这些目录也会被 run-parts​ 按计划执行。


5. run-parts 工具

​run-parts​ 是一个运行指定目录中所有可执行脚本的小工具。它会依次执行目录中的每个文件(通常要求文件名符合命名规范,例如不能包含点号 .​,以避免把编辑器备份文件等误当成脚本运行)。Debian 默认的 run-parts​ 还支持 --regex​、--list​ 等选项。

当 /etc/crontab​ 中的条目调用 run-parts /etc/cron.hourly​ 时,cron.hourly​ 目录里的所有脚本就会按顺序被执行。


6. 如何自定义脚本放入这些目录

  1. ​准备脚本​:编写一个可执行的 shell 脚本(或其他可执行文件),确保脚本开头有 shebang(如 #!/bin/bash​),并且文件具有执行权限:
    bash

    chmod +x my-backup-script
    
  2. ​命名规则​:为了避免被 run-parts​ 忽略,脚本名​不能包含点号(.​)​(例如 my-backup.sh​ 会被忽略,而 my-backup​ 则可以)。不过这一行为可以通过 run-parts​ 的参数调整,但默认如此。建议使用只包含字母、数字、连字符和下划线的名称。

  3. ​放入对应目录​:

    • 如果希望脚本每小时运行一次:sudo cp my-script /etc/cron.hourly/​

    • 每天运行:sudo cp my-script /etc/cron.daily/​

    • 每周:/etc/cron.weekly/​

    • 每月:/etc/cron.monthly/​

  4. ​验证​:你可以检查 /var/log/syslog​ 中的 cron 日志,或等待周期到达后观察效果。


7. /etc/cron.d/​ 的特殊用途

​/etc/cron.d/​ 目录允许你放置多个独立的 crontab 格式文件(类似碎片化的 /etc/crontab​)。每个文件内同样需要​指定执行任务的用户​。例如创建一个 /etc/cron.d/myapp​ 文件,内容为:

text

# 每天凌晨 3:30 以 www-data 用户执行清理任务
30 3 * * * www-data /usr/local/bin/cleanup.sh

这样做的好处是:

  • 不同软件包可以将自己的定时任务独立成文件,方便管理和卸载。

  • 无需直接修改 /etc/crontab​,避免冲突。


8. 与 anacron 的关系

  • ​anacron​ 是一个用于处理非 7×24 小时运行系统的定时任务工具。它会在系统开机后检查上次执行时间,若超过周期则补运行脚本。

  • Debian 默认配置中,cron.daily​、cron.weekly​、cron.monthly​ 通常由 anacron​ 驱动(通过 /etc/crontab​ 里对 /usr/sbin/anacron​ 的调用),而 cron.hourly​ 则由 cron 本身每分钟检查执行。

  • 如果你希望严格按精确时间执行每日/周/月任务,可以移除 anacron 并直接在 /etc/crontab​ 里配置 run-parts​ 调用,但这通常不推荐。


9. 简单示例

假设你想每天凌晨 2 点自动清理临时文件:

  1. 创建脚本 /usr/local/bin/clean-tmp.sh​:
    bash

    #!/bin/bash
    find /tmp -type f -atime +1 -delete
    
  2. 添加执行权限:
    bash

    sudo chmod +x /usr/local/bin/clean-tmp.sh
    
  3. 将脚本复制或链接到 /etc/cron.daily/​(注意名称不要含点号):
    bash

    sudo ln -s /usr/local/bin/clean-tmp.sh /etc/cron.daily/clean-tmp
    
  4. 完成,第二天它就会自动运行。


总结

  • ​cron.hourly​、cron.daily​、cron.weekly​、cron.monthly​ 是存放周期性脚本的目录,系统通过 run-parts​ 按时执行它们。

  • ​/etc/cron.d/​ 是存放额外 crontab 片段文件的目录,适合软件包或独立任务使用。

  • 利用这些目录可以避免直接编写复杂的 crontab 表达式,让任务管理更加模块化和清晰。

Author: Max

Permalink: /archives/linux-cron

Published: 2026-03-20 18:47:38

Updated: 2026-03-20 18:47:16

License: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG