程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 操作系统 - Linux

    • 基础操作
    • 目录操作
    • 文件操作
    • 用户和权限管控
    • 打包和解压
    • 定时任务管理
      • 系统管理
      • 网络服务操作
      • 磁盘分区管理
      • 其他常用命令
    • 云服务器
    • 操作系统 - Linux
    scholar
    2024-03-27
    目录

    定时任务管理

    # 1. 周期定时任务(cron)

    在Linux系统中,定时任务通常是通过cron服务来管理的。cron是一个基于时间的作业调度器,它使用户能够自动化脚本或命令的执行。定时任务可以通过crontab命令来配置,每个用户都可以有自己的crontab文件,此外还有一个系统级的crontab。

    cron服务在后台运行,检查是否有预定的作业需要在指定的时间执行。它会检查以下位置的配置文件:

    1、 /etc/crontab:这是系统的主crontab文件,包含了系统级别的定时任务配置。它通常由系统管理员编辑,用于设置系统范围的定时任务。

    2、/etc/cron.d/:这是一个目录,包含了系统的其他crontab文件。每个文件都代表一个独立的定时任务,由不同的软件包或服务创建和管理。

    3、/var/spool/cron/crontabs/:用户的crontab文件存储在这个目录下。每个用户都有一个以其用户名命名的文件,用于设置个人的定时任务。用户可以使用crontab -e命令编辑自己的crontab文件。

    # 1.1 常用的crontab命令

     
     



    crontab -l				 	  # 列出当前用户的crontab文件。
    crontab -e					  #  编辑当前用户的crontab文件。
    crontab -r					  # 删除当前用户的crontab文件。
    crontab -u <username> -l	  # 作为root用户,列出其他用户的crontab文件。
    
    1
    2
    3
    4

    crontab文件包含了一系列的作业和作业应当执行的时间。每一行都代表一个作业,格式如下:

    image-20231216232039789

    每个星号(*)可以用数字替换,表示特定的时间。还可以使用一些特殊字符来指定更复杂的时间安排:

    1. \*(星号)
      • 表示任意值,可以匹配任意时间单位(分钟、小时、日期、月份、星期几)。
      • 例如,在小时字段使用*会导致每个小时的相同分钟执行任务。
    2. \*/n(斜线加数字)
      • 表示每n个单位时间执行一次任务。
      • 例如,*/5在分钟字段中表示每5分钟执行一次任务。
    3. n(具体数值)
      • 表示特定的时间单位。
      • 例如,在分钟字段中的30表示每小时的第30分钟执行任务。
    4. n-m(范围)
      • 表示一个时间范围。
      • 例如,1-5在小时字段中表示从凌晨1点到凌晨5点(包括1点和5点)之间的每个小时执行任务。
    5. n,m(列表)
      • 表示特定的多个时间点。
      • 例如,1,3,5在日期字段中表示每月的1号、3号和5号执行任务。
    # 每分钟执行一次命令
    * * * * * command # 每分钟执行一次。每个 "*" 代表时间的每个单位(分钟、小时、日期、月份、星期)。
    
    # 每10分钟执行一次命令
    */10 * * * * command # 在分钟字段使用 "*/10" 表示从每个小时的开始每10分钟执行一次。
    
    # 在每小时的第0分钟执行命令
    0 * * * * command # 在分钟字段使用 "0",表示在每小时的开始执行。
    
    # 在每天午夜(00:00)执行命令
    0 0 * * * command # 分钟和小时字段都是 "0",表示在午夜执行。
    
    # 在每个月的第一天的午夜执行命令
    0 0 1 * * command # 日期字段为 "1",表示在每个月的第一天执行。
    
    # 在每周日的午夜执行命令
    0 0 * * 0 command # 星期字段为 "0"(或 "7",因为在Cron中0和7都表示星期日),表示每周日执行。
    
    # 在工作日的每2小时(从上午9点到下午5点,包含9点和17点)执行命令
    0 9-17/2 * * * command # 小时字段 "9-17/2" 表示从上午9点到下午5点,每2小时执行一次。
    
    # 在每个月的1号和15号的中午12点执行命令
    0 12 1,15 * * command # 日期字段 "1,15" 表示每月的1号和15号,在小时字段 "12" 表示中午12点。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    # 1.2 高级用法

    • 环境变量: 在crontab文件中,可以设置环境变量,这些变量将会在cron作业执行时生效。
    PATH=/usr/bin:/bin
    SHELL=/bin/bash
    * * * * * /path/to/script.sh
    
    1
    2
    3
    • 输出重定向: 通常,cron作业的输出会通过邮件发送给用户。如果要重定向输出到文件中,可以这样做:
    * * * * * /path/to/command > /path/to/logfile 2>&1
    
    1

    这里>是将标准输出重定向到文件,2>&1是将标准错误也重定向到同一个文件。

    • PATH问题: cron作业运行时的PATH可能与你的交互式shell中的PATH不同。为了确保作业能找到正确的命令,最好在脚本中设置完整的路径或者在crontab中设置PATH变量。

    注意事项

    • 权限问题: 确保你的脚本或命令有适当的权限能够被cron服务执行。
    • 环境问题: cron作业可能不会加载你的.bashrc或.profile文件,因此你的环境变量可能不会被加载。确保在crontab文件或脚本中明确设置所需的任何环境变量。
    • 编辑器: crontab -e命令会使用默认的文本编辑器来编辑crontab文件,如果你想使用其他编辑器,可以设置EDITOR环境变量,如export EDITOR=vim。

    # 2. 执行一次任务(at)

    在Linux系统中,at命令用于安排一个一次性任务,这意味着任务被执行一次后,就不会再次执行。at命令的执行依赖于atd守护进程,这是一个在后台运行的进程,负责定期检查作业队列,并执行那些到了指定执行时间的任务。

    1. atd守护进程会在后台运行,定期检查作业队列,如果队列中有任务的执行时间与当前时间匹配,那么该任务就会被执行。默认情况下,atd守护进程每60秒检查一次作业队列。
    2. 使用at命令时,需要确保atd守护进程正在运行。可以使用ps命令或其他相关命令来检查atd进程的状态。

    提示:atd 不是系统内置进程,使用前需要安装 `yum install atd`

    要使用at命令,您需要指定一个时间,格式可以是多种多样的,例如:

    # 语法:at [时间] [选项]
    atq 或者 at -l	  # 查看所有at任务
    atrm <job number>   # 删除指定任务
    at now + 1 minute   # 在1分钟后执行任务。
    at 5pm + 2 days 	# 在两天后的下午5点执行任务。
    at 14:00 July 25	# 在7月25日的下午2点执行任务。
    
    1
    2
    3
    4
    5
    6
    • -c:打印指定作业的内容到标准输出。

    • -f:从指定文件读取要执行的命令,而不是从标准输入读取。

    • -v:显示作业将被执行的时间,这是在提交作业时的反馈信息。

    • -l 或 -at:这是atq命令的别名,用于列出当前待执行的作业队列。

    • -d 或 -r:这是atrm命令的别名,用于删除指定的作业。

    • -t:使用特定的时间格式([CC]YYMMDDhhmm)。

    at命令接受多种时间格式,例如:

    • now + count time-units:从现在开始的一段时间后执行。
    • HH:MM:今天的特定时间,如果已经过了,则是明天。
    • midnight:午夜时刻。
    • noon:中午时刻。
    • teatime:下午4点。
    • MMDDYY, MM/DD/YY, DD.MM.YY:特定的日期。
    • next + weekday:下一个指定的工作日。
    • tomorrow:明天这个时候。
    • now:立即执行(实际上会有几秒的延迟)。
    # 使用echo将命令传递给at,安排在明天上午8点执行
    echo 'echo "Hello, world!" | mail -s "Test mail" user@qq.com' | at 08:00 tomorrow
    # 使用`-f`选项从`script.sh`文件中读取要执行的任务命令:
    at -f script.sh 11:00 PM
    
    1
    2
    3
    4
    编辑此页 (opens new window)
    上次更新: 2024/12/28, 18:32:08
    打包和解压
    系统管理

    ← 打包和解压 系统管理→

    Theme by Vdoing | Copyright © 2019-2025 程序员scholar
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式