在Linux系统中,一次性任务周期性任务是两种常见的任务调度方式,分别通过不同的工具实现。以下是详细说明:


一次性任务

用于执行一次后立即结束的任务,常用工具为 atbatch

at 命令

  • 功能:在指定时间运行一次任务。

  • 安装(部分系统需手动安装):

    sudo apt-get install at  # Debian/Ubuntu
    sudo yum install at      # CentOS/RHEL
    
  • 常用操作

    • 添加任务:

      echo "command" | at 14:30 2023-12-31   # 指定具体时间
      echo "command" | at now + 2 hours      # 2小时后执行
      
    • 查看任务队列:

      atq
      
    • 删除任务(通过任务ID):

      atrm <任务ID>
      

batch 命令

  • 功能:在系统负载较低时执行一次性任务(基于at实现)。

  • 示例

    echo "command" | batch
    

周期性任务

用于定期重复执行的任务,主要通过 cron 实现。

Cron 系统

  • 核心组件
    • cron 守护进程:后台服务,负责执行计划任务。
    • crontab 命令:用户管理自己的任务配置文件。
  • 配置文件位置
    • 用户级:/var/spool/cron/<用户名>(通过 crontab -e 编辑)。
    • 系统级:/etc/crontab/etc/cron.d/(需root权限)。

Crontab 语法

  • 基本格式

    * * * * * <命令>
    │ │ │ │ │
    │ │ │ │ └── 星期几 (0-7, 0和7均为周日)
    │ │ │ └──── 月份 (1-12)
    │ │ └────── 日 (1-31)
    │ └──────── 小时 (0-23)
    └────────── 分钟 (0-59)
    
  • 特殊字符

    • *:任意值。
    • ,:分隔多个时间点(如 1,3,5)。
    • -:范围(如 1-5)。
    • */n:每隔n单位(如 */10 表示每10分钟)。
  • 示例

    0 3 * * * /backup.sh       # 每天凌晨3点执行
    */5 * * * * /monitor.sh    # 每5分钟执行
    0 0 1 * * /report.sh       # 每月1日午夜执行
    

Crontab 管理命令

  • 编辑当前用户的任务:

    crontab -e
    
  • 查看任务列表:

    crontab -l
    
  • 删除所有任务:

    crontab -r
    

系统级Cron

  • 直接编辑 /etc/crontab 或添加脚本到以下目录:

    /etc/cron.hourly/   # 每小时
    /etc/cron.daily/    # 每天
    /etc/cron.weekly/   # 每周
    /etc/cron.monthly/  # 每月
    

注意事项

  1. 环境变量问题:Cron任务默认使用最小环境变量,建议使用绝对路径或在脚本中设置变量。
  2. 日志查看:Cron任务日志通常位于 /var/log/cron/var/log/syslog
  3. 权限控制
    • 限制用户使用Cron:通过 /etc/cron.allow/etc/cron.deny 文件。
    • at 的权限控制文件为 /etc/at.allow/etc/at.deny