运维.Linux下执行定时任务(中:Cron的常用替代方案)

运维系列
Linux下执行定时任务(中:Cron的常用替代方案)

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139969289
HuaWei:https://bbs.huaweicloud.com/blogs/429813

【介绍】:本文介绍除了Cron外,其他常见的定时任务方案用法。


上一节:《 Linux下执行定时任务(上:Cron简介与用法解析)
| 下一节:《 Python布式任务队列系统:Celery(下执行定时任务 - 下:)

在这里插入图片描述


1. 概述

尽管CRON是一个强大且广泛使用的定时任务工具,但在某些情况下,它可能不是最佳选择。随着技术的发展和需求的多样化,许多替代方案应运而生,以解决CRON的一些局限性并提供更多功能。本文将探讨CRON的局限性,并介绍几种常用的替代方案。

1.1 CRON的局限性

虽然CRON在许多场景下表现出色,但它也存在一些限制:

  1. 精度限制:CRON的最小时间单位是分钟,不适合需要秒级或毫秒级精度的任务。

  2. 复杂依赖管理:对于有复杂依赖关系的任务,CRON难以直接处理任务之间的依赖关系。

  3. 错过执行的处理:如果系统在预定执行时间关机,CRON默认不会在系统重启后执行错过的任务。

  4. 分布式系统支持:在分布式环境中,CRON难以协调跨多个服务器的任务执行。

  5. 动态调度:CRON不支持基于实时条件动态调整任务执行计划。

  6. 资源管理:CRON本身不提供任务的资源使用限制或优先级管理。

  7. 监控和报告:虽然可以通过其他工具实现,但CRON本身缺乏内置的全面监控和报告功能。

鉴于CRON的这些局限性,在某些场景下我们需要寻找替代方案。理想的替代方案应该能够:

  1. 提供更精细的时间控制
  2. 处理复杂的任务依赖关系
  3. 管理错过的任务执行
  4. 支持分布式环境
  5. 允许动态调度
  6. 提供资源管理和优先级控制
  7. 集成监控和报告功能

1.2 常见替代方案概览

本文将介绍以下几种CRON的常用替代方案:

  1. Systemd Timers:现代Linux系统中的内置选项,提供更精确的时间控制和更好的日志管理。

  2. Anacron:适用于不需要精确时间执行,但需要保证任务最终会被执行的场景。

  3. at 命令:用于安排一次性任务在未来的某个时间点执行。

这些替代方案各有特点,适用于不同的场景和需求。在接下来的章节中,我们将详细探讨Systemd TimersAnacronat 命令的特性、优势、适用场景以及基本使用方法,帮助读者根据自己的具体需求选择最合适的工具。

2. Systemd Timers

2.1 简介

Systemd Timers 是现代 Linux 系统中 CRON 的一个强大替代品。它具有以下优点:

  1. 更精确的时间控制,支持毫秒级精度。
  2. 更好的日志管理和错误报告。
  3. 可以轻松处理错过的任务(例如,系统关机时)。
  4. 与其他 systemd 服务集成更好。

2.2 工作原理

Systemd Timers 由两个主要组件组成:

  1. Timer 单元.timer 文件):定义何时触发任务。
  2. Service 单元.service 文件):定义要执行的实际任务。

当 Timer 单元触发时,它会启动相应的 Service 单元。这种分离允许更灵活的配置和管理。

2.3 基本使用

以下是创建和使用 Systemd Timer 的基本步骤:

  1. 创建 Service 单元文件(例如:my-task.service):
[Unit]
Description=My scheduled task

[Service]
ExecStart=/path/to/my/script.sh
  1. 创建 Timer 单元文件(例如:my-task.timer):
[Unit]
Description=Run my task every hour

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target
  1. 将文件放在 /etc/systemd/system/ 目录下。

  2. 重新加载 systemd 配置:

sudo systemctl daemon-reload
  1. 启用并启动定时器:
sudo systemctl enable my-task.timer
sudo systemctl start my-task.timer

2.4 高级功能

Systemd Timers 提供了许多高级功能,包括:

  1. 精确调度:支持复杂的时间表达式,如 OnCalendar=Mon,Tue *-*-01..07 12:00:00

  2. 随机延迟:可以添加随机延迟以避免多个任务同时启动,例如 RandomizedDelaySec=10m

  3. 持久性:使用 Persistent=true 可以在系统启动后执行错过的任务。

  4. 单调时间:使用 OnUnitActiveSec= 可以基于上次任务完成时间来调度下一次执行。

  5. 依赖管理:可以设置 Timer 单元依赖于其他单元,确保按正确顺序执行。

2.5 管理和监控

Systemd 提供了多种工具来管理和监控定时器:

  1. 列出所有定时器:

    systemctl list-timers
    
  2. 查看定时器状态:

    systemctl status my-task.timer
    
  3. 查看任务执行日志:

    journalctl -u my-task.service
    

2.6 优缺点和使用常见

Systemd Timers是一个强大的 CRON 替代品,特别适合需要精确控制和系统级集成的现代 Linux 环境。它特别适合以下场景:

  1. 需要毫秒级精度的任务调度。
  2. 系统级任务,特别是那些需要与其他系统服务集成的任务。
  3. 需要详细日志和错误报告的任务。
  4. 在系统重启后需要执行错过的任务的场景。

不过Systemd Timers也有一些局限性:

  1. 配置相对复杂,学习曲线较陡。
  2. 不适用于非 systemd 的系统。
  3. 对于简单的用户级任务,可能显得过于复杂。

好的,我将为您详细展开 “7.2 Anacron” 部分。

3. Anacron

3.1 简介

Anacron 是一个补充 CRON 的工具,特别适用于不需要精确时间执行,但需要保证任务最终会被执行的场景。它主要用于处理在系统关机时错过的定期任务,特别适合不是 24/7 运行的系统,如个人电脑或笔记本电脑。

3.2 工作原理

Anacron 的工作原理如下:

  1. 定期检查任务是否在指定的时间间隔内执行过。
  2. 如果任务没有在指定时间内执行,Anacron 会在系统下次启动时运行该任务。
  3. Anacron 使用时间戳文件来跟踪任务的最后执行时间。
  4. 任务执行后,Anacron 更新时间戳文件。

3.3 基本使用

Anacron 的配置文件通常位于 /etc/anacrontab。以下是一个基本的配置示例:

# 周期  延迟  任务标识符      命令
1        5    daily-backup    /path/to/backup-script.sh
7        10   weekly-cleanup  /path/to/cleanup-script.sh
@monthly 15   monthly-report  /path/to/report-script.sh

配置说明:

  • 周期:指定任务执行的间隔(天数)。使用 @daily@weekly@monthly 也是可以的。
  • 延迟:任务开始前的延迟时间(分钟),用于避免系统启动时多个任务同时运行。
  • 任务标识符:用于识别任务的唯一名称。
  • 命令:要执行的实际命令或脚本。

3.4 高级功能

  1. 自定义时间戳目录
    可以通过设置 ANACRONTAB 环境变量来指定自定义的 anacrontab 文件位置。

  2. 随机延迟
    可以使用 START_HOURS_RANGE 设置来指定任务可以开始执行的时间范围,增加随机性。

  3. 条件执行
    可以在命令前添加条件检查,例如:

    1 5 daily-task test -x /path/to/script && /path/to/script
    
  4. 用户特定的 Anacron
    某些系统允许用户创建自己的 anacrontab 文件,通常位于 ~/.anacron/ 目录。

3.5 管理和监控

  1. 手动运行 Anacron

    sudo anacron -f
    

    这将强制执行所有到期的任务。

  2. 查看 Anacron 日志
    Anacron 的日志通常记录在系统日志中,可以通过以下命令查看:

    grep anacron /var/log/syslog
    
  3. 测试配置
    使用 -T 选项可以测试 anacrontab 文件的语法:

    anacron -T
    

3.6 优缺点和适用场景

优点

  1. 适合不需要精确时间执行的任务。
  2. 确保即使系统不是持续运行,任务最终也会被执行。
  3. 避免了多个错过的任务在系统启动时同时运行。
  4. 配置相对简单。

缺点

  1. 不适合需要精确时间执行的任务。
  2. 不支持小于一天的执行间隔。
  3. 不适合需要实时响应的任务。

适用场景

  1. 个人电脑或笔记本电脑上的维护任务。
  2. 不需要精确执行时间的定期备份任务。
  3. 系统清理和更新等不频繁的维护工作。
  4. 需要确保任务最终会被执行,但执行时间不敏感的场景。

AnacronCRON 的一个很好的补充,特别适合那些不需要精确时间执行,但需要确保任务最终会被执行的场景。它的简单性和可靠性使其成为许多系统管理员和个人用户的首选工具,尤其是在处理非持续运行系统上的定期任务时。

好的,我将为您详细展开 “4. at 命令” 这一部分。

4. at 命令

4.1 简介

at 命令是 Unix-like 系统中的一个实用工具,用于安排一次性任务在未来的某个特定时间点执行。与 CRON 不同,at 主要用于执行一次性的计划任务,而不是重复性任务。

4.2 工作原理

at 命令的工作原理如下:

  1. 用户指定一个未来的时间点和要执行的命令。
  2. at 守护进程(通常是 atd)将任务信息存储在队列中。
  3. 当指定的时间到达时,atd 执行相应的任务。
  4. 任务执行完成后,它会从队列中删除。

4.3 基本使用

4.3.1 基本语法

at [选项] 时间

4.3.2 时间指定方式

at 命令支持多种时间指定方式:

  1. 具体时间:

    at 2:30pm
    at 14:30
    
  2. 相对时间:

    at now + 1 hour
    at now + 30 minutes
    
  3. 特定日期:

    at 2:30pm July 31
    at 14:30 31.7.23
    

4.3.3 使用示例

  1. 安排任务在 5 分钟后执行:

    at now + 5 minutes
    warning: commands will be executed using /bin/sh
    at> echo "Hello, future!" > /tmp/at_test.txt
    at> 
    job 1 at Wed Jul 12 15:05:00 2023
    

    输入完命令后,按 Ctrl+D 结束输入。

  2. 从文件中读取命令:

    at 10:00 PM -f /path/to/script.sh
    
  3. 在特定日期执行任务:

    at 9:00 AM Aug 15
    at> /home/user/backup.sh
    at> 
    
  4. 使用管道输入命令:

    echo "mail -s 'Report' boss@example.com < /tmp/report.txt" | at 5:00 PM
    

4.4 高级功能

  1. 批处理模式
    batch 命令类似于 at,但它会在系统负载较低时执行任务:

    batch
    at> long_running_script.sh
    at> 
    
  2. 指定队列
    使用 -q 选项可以指定不同的队列(用字母 a-z 表示):

    at -q b 2:00 PM
    
  3. 邮件通知
    默认情况下,at 会在任务执行完成后发送邮件。使用 -m 选项可以确保即使没有输出也发送邮件。

  4. 环境变量
    at 会继承当前 shell 的环境变量,这可以用来设置特定的执行环境。

4.5 管理和监控

  1. 查看待执行的任务

    atq
    

    at -l
    
  2. 查看特定任务的详情

    at -c [job number]
    
  3. 删除计划任务

    atrm [job number]
    

    at -r [job number]
    
  4. 限制用户使用 at
    通过编辑 /etc/at.allow/etc/at.deny 文件可以控制哪些用户可以使用 at 命令。

4.6 优缺点和适用场景

优点

  1. 简单易用,适合快速安排一次性任务。
  2. 不需要修改系统配置文件。
  3. 可以精确到分钟级别的调度。
  4. 支持在系统负载较低时执行任务(使用 batch 命令)。

缺点

  1. 主要用于一次性任务,不适合重复性任务。
  2. 如果系统在指定时间关机,任务将不会执行。
  3. 管理大量 at 任务可能变得复杂。

适用场景

  1. 需要在特定时间执行的一次性维护任务。
  2. 延迟执行的命令或脚本。
  3. 在未来某个时间点发送提醒或通知。
  4. 在非工作时间安排资源密集型任务。
  5. 临时性的系统管理任务。

at 命令是一个强大而灵活的工具,特别适合那些需要在未来某个时间点执行一次性任务的场景。它的简单性使其成为系统管理员和开发者的得力助手,尤其是在处理临时性或紧急任务时。然而,对于需要定期重复执行的任务,CRON 或其他替代方案可能更为合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/744542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android集成mapbox教程

目录 简介准备工作创建Token系统开发简介 Mapbox是来自美国的一家为开发者提供地图服务和开发工具的开放平台。Mapbox以开源的形式构建了矢量瓦片技术生态,开发了矢量切片工具、瓦片服务传输框架。Mapbox的底图平台非常受欢迎,特别是开发者和学生群体,可以使用免费的开源软…

FileNotFoundError: Cannot find DGL C++ graphbolt library at ...

FileNotFoundError: Cannot find DGL C graphbolt library at ...-CSDN博客https://blog.csdn.net/weixin_44017989/article/details/137658749

2024最新算法:鳗鱼和石斑鱼优化(Eel and grouper optimizer,EGO)算法求解23个函数,MATLAB代码

一、算法介绍 鳗鱼和石斑鱼优化器&#xff08;Eel and grouper optimizer&#xff0c;EGO&#xff09;是2024年提出的一种智能优化算法&#xff0c;EGO算法的灵感来自海洋生态系统中鳗鱼和石斑鱼的共生相互作用和觅食策略。 参考文献&#xff1a; [1]A. Mohammadzadeh, S. Mi…

学会python——统计文件中文字出现次数(python实例九)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、统计文本文件中单词频率 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计…

浅谈逻辑控制器之ForEach控制器

浅谈逻辑控制器之ForEach控制器 ForEach控制器是一个非常实用的功能&#xff0c;它允许用户遍历某个变量的所有值&#xff0c;并为每个值执行控制器内的子采样器或逻辑。这对于处理从先前请求&#xff08;如CSV Data Set Config、JSON Extractor、Regular Expression Extracto…

设计工程师在FMEA团队中的职责是什么?

在复杂多变的工程环境中&#xff0c;FMEA&#xff08;失效模式与影响分析&#xff09;已成为确保产品质量、提高系统可靠性和降低潜在风险的关键工具。FMEA团队由多个专业领域的专家组成&#xff0c;其中设计工程师作为团队的重要成员&#xff0c;扮演着至关重要的角色。本文&a…

boost asio异步服务器(4)处理粘包问题tlv

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…

BP神经网络

BP神经网络 BP神经网络是一种多层前馈神经网络&#xff0c;它通过反向传播算法进行训练&#xff0c;旨在最小化损失函数&#xff0c;从而对输入数据进行精确的分类或回归预测。 背景 BP (Back Propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概…

SAP ABAP 之容器

文章目录 前言一、案例介绍/笔者需求二、自定义容器 a.实例化对象 b.自定义容器效果演示 c.Copy Code 三、自适应容器 a.常用 必须 参数理解 b.METRIC 度量单位 c.RATIO 百分比尺寸 d.STYLE 容器…

商业银行流动性创造指标数据集(2005-2022)

数据简介&#xff1a;中文数据库商业银行流动性创造指标参考邓伟等老师&#xff08;2022&#xff09;的做法&#xff0c;常备借贷便利与中期借贷便利数据来源于中国人民银行发布的《中国货币政策执行报告》。银行层面的微观指标主要来源于BankScope数据库和CSMAR数据库&#xf…

Spring Cloud Netflix:构建强大微服务生态系统的利器

Spring Cloud Netflix是一组集成框架&#xff0c;它将Netflix的多个开源组件整合到Spring Boot应用程序中&#xff0c;使得构建云原生应用程序变得更加简单。这些组件包括用于服务发现和注册的Eureka&#xff0c;断路器模式的实现Hystrix&#xff0c;用于API网关的Zuul&#xf…

springboot家乡特色推荐系统 LW +PPT+源码+讲解

3系统需求分析 3.1系统功能 通过前面的功能分析可以将家乡特色推荐系统的功能分为管理员和用户两个部分&#xff0c;系统的主要功能包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;文章分类管理&#xff0c;文章分享管理&#xff0c;系统管理等内容。任何用户…

【c语言】二级指针

1&#xff0c;定义 本质还是从指针的角度去理解&#xff0c;只不过存的指针的值 2&#xff0c;使用方法

第三方软件连接虚拟机

第三方软件连接虚拟机 1 查看本机VM&#xff08;VMware&#xff09;虚拟机网段2 开启虚拟机系统&#xff0c;修改网卡配置3 重新打开网络并测试连通性4 打开VM虚拟机网络开关5 通过第三方软件建立连接6 可能遇到的问题 1 查看本机VM&#xff08;VMware&#xff09;虚拟机网段 子…

38.控制功能实现

上一个内容&#xff1a;37.添加简易的调试功能 以 37.添加简易的调试功能 它的代码为基础进行修改 效果图&#xff1a; 下图红框位置的功能实现 Dlls项目中添加一个Dialog Dialog如下 然后给它添加一个类&#xff0c;MFC添加的类可能会报错添加 #include "afxdialogex.h…

煤矿智能巡检机器人:推动煤矿行业变革的关键力量

目前我国煤炭资源总量达到了2078.85亿吨&#xff0c;已探明储量为1432亿吨&#xff0c;煤矿能源现阶段还是我国重要的基础能源。而煤矿生产作业存在巨大危险&#xff0c;主要包括高温、高压、燃爆和有毒气体等环境因素&#xff0c;同时机械设备运转过程中潜藏着重大风险。这些危…

【Python/Pytorch - 网络模型】-- 高阶SVD算法

文章目录 文章目录 00 写在前面01 基于Python版本的高阶SVD算代码02 HOSVD 的步骤 00 写在前面 高阶奇异值分解&#xff08;Higher-Order SVD&#xff0c;HOSVD&#xff09;是一种将传统的奇异值分解&#xff08;SVD&#xff09;扩展到高阶张量的方法。它能够将一个高阶张量分…

【摄像头标定】使用kalibr进行双目摄像头标定(ros1、ros2)

使用kalibr进行双目摄像头标定 前言标定板标定①板端准备和录制②上位机准备和标定 前言 本文不是纯用ros1进行标定&#xff0c;需要ros1和ros2通信。给使用ros2进行开发&#xff0c;但又想用kalibr标定双目摄像头的小伙伴一个教程。本文双目摄像头的数据发布使用ros2&#xf…

fork 是一个创建新进程的系统调用

在计算机科学中&#xff0c;fork 是一个创建新进程的系统调用。具体来说&#xff0c;fork 调用会创建一个与当前进程几乎完全相同的副本&#xff0c;包括父进程的内存布局、环境变量、打开的文件描述符等。这个新的进程被称为子进程&#xff0c;而原始进程被称为父进程。 以下…

Spring+Vue项目部署

目录 一、需要的资源 二、步骤 1.首先要拥有一个服务器 2.项目准备 vue&#xff1a; 打包: 3.服务器装环境 文件上传 设置application.yml覆盖 添加启动和停止脚本 ​编辑 安装jdk1.8 安装nginx 安装mysql 报错&#xff1a;「ERR」1273-Unknown collation: utf8m…