小小白祈祷中...

crontabLinux 和类 Unix 系统中用来管理定时任务的命令。通过 crontab,可以定期执行脚本或命令,比如每天备份、自动清理日志等。crontab 是基于 cron 服务的用户接口,每个用户都可以单独定义自己的定时任务。


基本语法

1
crontab [选项]
  • 常用选项
选项 功能
-e 编辑当前用户的 crontab 文件。
-l 列出当前用户的 crontab 内容。
-r 删除当前用户的 crontab 文件(清空定时任务)。
-u 用户 指定用户管理其 crontab(需要管理员权限)。

crontab 文件格式

crontab 文件的每一行定义一个任务,其格式如下:

1
分钟 小时 日 月 星期 [命令或脚本]
  • 时间字段的解释:
字段 范围 描述
分钟 0-59 指定在每小时的哪一分钟执行任务。
小时 0-23 指定在每天的哪个小时执行任务。
1-31 指定在每月的哪一天执行任务。
1-12 指定在哪个月执行任务。
星期 0-7 指定在每周的哪一天执行任务,07 都表示星期日。
  • 特殊符号
符号 含义
* 任意值(例如,每分钟、每天等)。
, 指定多个值(例如,1,15 表示第 1 分钟和第 15 分钟)。
- 指定范围(例如,1-5 表示从第 1 分钟到第 5 分钟)。
/ 指定步长(例如,*/5 表示每 5 分钟执行一次)。

示例任务时间表

表达式 含义
0 5 * * * 每天早上 5 点执行任务。
30 8 * * 1-5 每周一到周五早上 8:30 执行任务。
*/10 * * * * 每 10 分钟执行一次任务。
0 0 1 * * 每月 1 日凌晨 0 点执行任务。
0 0 * * 0 每周日凌晨 0 点执行任务。
0 */2 * * * 每两小时执行一次任务。
0 8,18 * * * 每天 8 点和 18 点执行任务。

crontab 管理任务的步骤

查看当前用户的任务

  • 命令:
    1
    crontab -l
  • 说明:
    • 列出当前用户的所有定时任务。
    • 如果没有任务,则会显示类似以下内容:
      1
      no crontab for <user>

编辑定时任务

  • 命令:
    1
    crontab -e
  • 说明:
    • 打开当前用户的 crontab 文件(默认使用系统的文本编辑器,如 vimnano)。
    • 在文件中添加新的任务,每行一个任务。

示例

crontab -e 中添加以下内容:

1
0 6 * * * /home/user/backup.sh
  • 任务说明:
    • 每天早上 6 点运行 /home/user/backup.sh 脚本。

删除所有定时任务

  • 命令:
    1
    crontab -r
  • 说明:
    • 删除当前用户的所有定时任务。
    • 注意:此操作不可恢复,请小心使用!

为其他用户管理任务

  • 命令(需要管理员权限):
    1
    sudo crontab -u username -e
  • 说明:
    • 编辑指定用户的 crontab 文件。
    • 通常用于管理员为其他用户配置任务。

特殊时间宏

crontab 支持一些特殊的时间宏,可以简化时间表达式:

等价表达式 含义
@reboot - 系统启动时执行任务。
@yearly@annually 0 0 1 1 * 每年执行一次(1 月 1 日 0 点)。
@monthly 0 0 1 * * 每月执行一次(1 日 0 点)。
@weekly 0 0 * * 0 每周执行一次(周日 0 点)。
@daily@midnight 0 0 * * * 每天执行一次(0 点)。
@hourly 0 * * * * 每小时执行一次。

示例

  • 在系统启动时运行任务:
    1
    @reboot /home/user/startup.sh

查看和调试任务

查看任务执行日志

  • 系统会记录 cron 任务的执行日志,日志文件通常位于:
    • Debian/Ubuntu

      1
      /var/log/syslog

      查看日志:

      1
      grep CRON /var/log/syslog
    • CentOS/RHEL

      1
      /var/log/cron

调试任务

如果任务没有按预期执行,可以尝试以下方法:

  1. 确保脚本有可执行权限

    1
    chmod +x /path/to/script.sh
  2. 使用绝对路径

    • crontab 中,环境变量可能与登录时不同,因此需要使用命令或文件的绝对路径。
  3. 捕获输出

    • 将标准输出和错误输出重定向到日志文件:
      1
      0 6 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
  4. 测试环境变量

    • 在脚本顶部添加:
      1
      env > /tmp/env.log
    • 查看是否缺少必要的环境变量。

综合示例

示例 1:每周一凌晨 2 点备份日志文件

1
0 2 * * 1 tar -czf /var/backups/logs_$(date +\%Y\%m\%d).tar.gz /var/log

示例 2:每 10 分钟检查服务是否运行

1
*/10 * * * * systemctl is-active nginx || systemctl start nginx
  • 如果 Nginx 服务未运行,则启动它。

示例 3:系统启动时挂载网络驱动器

1
@reboot mount -t nfs 192.168.1.100:/shared /mnt/network

示例 4:每天下午 5 点发送提醒邮件

1
0 17 * * * echo "Backup completed" | mail -s "Daily Backup Status" user@example.com

注意事项

  1. 环境变量

    • cron 的运行环境与用户登录的环境不同,可能缺少一些变量。
    • 可以在任务开头指定所需变量,例如:
      1
      PATH=/usr/local/bin:/usr/bin:/bin
  2. 权限问题

    • 普通用户只能编辑自己的 crontab
    • /etc/cron.allow/etc/cron.deny 文件可以控制用户是否允许使用 cron
  3. 任务频率太高

    • 如果任务频率太高(如每秒运行一次),可能会对系统造成压力。

总结

  • crontab 是 Linux 系统中管理定时任务的核心工具,具有灵活强大的时间调度功能。
  • 常用命令
    • 查看任务:crontab -l
    • 编辑任务:crontab -e
    • 删除任务:crontab -r
  • 编写任务时要特别注意时间字段格式、环境变量和日志捕获等问题,以确保任务正常执行。