Linux使用systemd安排定期任务的操作详解

news2024/9/30 21:02:03

systemd 定时器是一种替代传统 cron 的方法,用于安排定时任务。
systemd 定时器由两部分组成:一个 .service 文件和一个 .timer 文件。
.service 文件定义了要执行的任务,而 .timer 文件设定了何时执行这个任务。
通常位于 /etc/systemd/system/ 或 /usr/lib/systemd/system/ 目录下。

1)创建服务文件

创建一个 .service 文件来定义要执行的任务,该文件定义了任务的执行方式。

例如:创建 /etc/systemd/system/backup.service 文件,内容如下,

[Unit]
Description=Run backup script

[Service]
ExecStart=/path/to/backup-script.sh

在这个文件中:

  • [Unit] 部分:定义单元的基本信息,包括描述和依赖关系。
    Description 字段提供了该服务的简短描述。
  • [Service] 部分:定义服务的执行方式。
    ExecStart 字段指定了服务启动时要执行的命令或脚本。

2)创建 .timer 文件

.service文件创建完成后,还需要创建一个定时器文件(.timer),例如,

创建 /etc/systemd/system/backup.timer 文件,内容如下,

[Unit]
Description=Run backup script every hour

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target


在这个文件中:

  • [Unit] 部分:定义单元的基本信息,包括描述和依赖关系。
    常见的字段有 Description 和 After 等。
    Description 字段提供了该定时器的简短描述。
    After:指定该单元需要在另一个单元之后启动
  • [Timer] 部分:定义定时器的属性和触发条件。
    常见的字段有 OnCalendarOnBootSecOnUnitActiveSec、Persistent  等。
    OnCalendar 字段指定了定时器的触发时间,这里表示每小时触发一次。OnActiveSecOnBootSecOnStartupSecOnUnitActiveSecOnUnitInactiveSec定义定时器在特定事件后的触发时间。
    Persistent 字段表示如果系统在预定时间未启动,定时器将在系统启动时立即触发。AccuracySec:设置定时器触发的精确度。
    RandomizedDelaySec:添加随机延迟,避免多个定时器同时触发。
  • [Install] 部分:指定定时器的安装和启用方式。
    常见的字段有 WantedBy 和 RequiredBy 等。
    WantedBy 字段指定该定时器属于 timers.target,确保定时器在系统启动时被激活。

常见的定时器类型

systemd 定时器支持多种触发条件,下面介绍一些常见的定时器类型及其用法:

OnActiveSec:在定时器激活后经过指定时间触发。适用于需要在特定时间间隔后执行的任务。

示例:

1

OnActiveSec=1h

表示在定时器激活后 1 小时触发。

OnBootSec:在系统启动后经过指定时间触发。适用于需要在系统启动后执行的任务。

示例:

1

OnBootSec=30min

表示在系统启动后 30 分钟触发。

OnStartupSec:在 systemd 启动后经过指定时间触发。适用于需要在 systemd 启动后执行的任务。

示例:

1

OnStartupSec=15min

表示在 systemd 启动后 15 分钟触发。

OnUnitActiveSec:在关联的服务单元最后一次激活后经过指定时间触发。适用于需要在服务激活后执行的任务。

示例:

1

OnUnitActiveSec=1h

表示在关联的服务单元最后一次激活后 1 小时触发。

OnUnitInactiveSec:在关联的服务单元最后一次非活跃后经过指定时间触发。适用于需要在服务停止后执行的任务。

示例:

1

OnUnitInactiveSec=2h

表示在关联的服务单元最后一次非活跃后 2 小时触发。

OnCalendar:按照指定的时间表触发,类似于 cron 表达式。适用于需要按照特定时间表执行的任务。

示例:

1

OnCalendar=hourly

表示每小时触发一次。

定时器单元的工作原理

systemd 定时器单元通过定义触发条件来调度关联的服务单元。当定时器触发时,systemd 会自动启动关联的服务单元。定时器和服务单元通常成对出现,例如 backup.timer 和 backup.service

定时器单元的工作流程如下:

  • 创建一个服务单元文件,定义任务的执行方式。
  • 创建一个定时器单元文件,定义任务的触发条件。
  • 启动和启用定时器单元。
  • 定时器触发时,systemd 自动执行关联的服务单元。

通过这种方式,systemd 提供了一种灵活且强大的方法来管理和调度定期任务

3)定时器使用相关命令

4)高级定时器配置

复杂的时间表达式

systemd 定时器单元支持使用 OnCalendar 属性定义复杂的时间表达式。OnCalendar 属性类似于 cron 表达式,但更加灵活和强大。它支持多种格式的时间表达式,允许用户精确地定义定时器的触发时间。

常见的时间表达式

基础格式YYYY-MM-DD HH:MM:SS

例子:2024-06-05 02:30:00 表示在 2024 年 6 月 5 日凌晨 2:30 触发。

通配符格式* 代表任意值

例子:*-*-01 00:00:00 表示每月的第一天凌晨 0 点触发。

列表格式:使用逗号分隔多个值

例子:Mon,Fri *-*-* 09:00:00 表示每周一和周五早上 9 点触发。

范围格式:使用 .. 定义一个范围

例子:*-*-01..07 00:00:00 表示每月的前七天的凌晨 0 点触发。

重复格式:使用 / 定义重复间隔

例子:*-*-* *:00/15:00 表示每小时的 0 分和 15 分触发。

示例:复杂的时间表达式

每月的第一个星期一:

1

OnCalendar=Mon *-*-1..7 00:00:00

这表示每月的第一个星期一凌晨 0 点触发。

每周的星期一和星期三:

1

OnCalendar=Mon,Wed *-*-* 00:00:00

这表示每周的星期一和星期三凌晨 0 点触发。

每天下午 3 点和晚上 9 点:

1

OnCalendar=*-*-* 15,21:00:00

这表示每天的下午 3 点和晚上 9 点触发。

使用 OnCalendar 和其他定时器属性

除了 OnCalendar 属性外,systemd 定时器单元还支持其他定时器属性,允许用户定义在特定事件后的触发时间。这些属性可以与 OnCalendar 一起使用,提供更灵活的时间调度。

OnActiveSec

OnActiveSec 属性定义在定时器激活后经过指定时间触发。适用于需要在特定时间间隔后执行的任务。

示例:

1

OnActiveSec=1h

表示在定时器激活后 1 小时触发。

OnBootSec

OnBootSec 属性定义在系统启动后经过指定时间触发。适用于需要在系统启动后执行的任务。

示例:

1

OnBootSec=30min

表示在系统启动后 30 分钟触发。

OnStartupSec

OnStartupSec 属性定义在 systemd 启动后经过指定时间触发。适用于需要在 systemd 启动后执行的任务。

示例:

1

OnStartupSec=15min

表示在 systemd 启动后 15 分钟触发。

OnUnitActiveSec

OnUnitActiveSec 属性定义在关联的服务单元最后一次激活后经过指定时间触发。适用于需要在服务激活后执行的任务。

示例:

1

OnUnitActiveSec=1h

表示在关联的服务单元最后一次激活后 1 小时触发。

OnUnitInactiveSec

OnUnitInactiveSec 属性定义在关联的服务单元最后一次非活跃后经过指定时间触发。适用于需要在服务停止后执行的任务。

示例:

1

OnUnitInactiveSec=2h

表示在关联的服务单元最后一次非活跃后 2 小时触发。

配置定时器的精确度和随机延迟

为了优化系统性能并避免多个定时器同时触发,systemd 提供了 AccuracySec 和 RandomizedDelaySec 属性,用于配置定时器的精确度和随机延迟。

AccuracySec

AccuracySec 属性设置定时器触发的精确度。较大的精确度值可以减少系统负载,因为定时器触发时间可以稍微偏离设定值。

示例:

1

AccuracySec=1min

表示定时器触发的精确度为 1 分钟,即触发时间可以在预定时间的前后 1 分钟内波动。

RandomizedDelaySec

RandomizedDelaySec 属性添加随机延迟,避免多个定时器同时触发,从而减少系统负载。

示例:

1

RandomizedDelaySec=30min

表示在预定触发时间基础上添加最多 30 分钟的随机延迟。

在特定条件下触发定时器

systemd 还支持在特定条件下触发定时器,例如系统空闲时或网络连接时。通过使用 Condition 和 Assert 属性,可以实现更灵活的任务调度。

示例:在系统空闲时触发定时器

创建一个定时器单元文件,在系统空闲时触发任务:

1

2

3

4

5

6

7

8

9

10

11

12

13

[Unit]

Description=Run maintenance script when system is idle

[Timer]

OnCalendar=daily

Persistent=true

[Install]

WantedBy=timers.target

[Service]

Type=idle

ExecStart=/path/to/maintenance-script.sh

在这个示例中,Type=idle 表示在系统空闲时执行任务。

示例:在网络连接时触发定时器

创建一个定时器单元文件,在网络连接时触发任务:

1

2

3

4

5

6

7

8

9

10

11

12

13

[Unit]

Description=Run network sync script when network is up

After=network-online.target

[Timer]

OnCalendar=hourly

Persistent=true

[Install]

WantedBy=timers.target

[Service]

ExecStart=/path/to/network-sync-script.sh

在这个示例中,After=network-online.target 表示在网络连接后执行任务。

管理和调试 systemd 定时器

管理 systemd 定时器

管理 systemd 定时器涉及定时器单元的启动、停止、启用、禁用和查看状态等操作。

要启动定时器单元,可以使用以下命令:

1

sudo systemctl start backup.timer

这将立即启动定时器并按照配置的时间计划执行关联的服务单元。

要停止定时器单元,可以使用以下命令:

1

sudo systemctl stop backup.timer

这将停止定时器,关联的服务单元将不再按计划触发。

要启用定时器单元,使其在系统启动时自动启动,可以使用以下命令:

1

sudo systemctl enable backup.timer

要禁用定时器单元,使其不再在系统启动时自动启动,可以使用以下命令:

1

sudo systemctl disable backup.timer

要查看定时器单元的状态,可以使用以下命令:

1

systemctl status backup.timer

这个命令会显示定时器的当前状态、下次触发时间、最近一次触发时间以及相关日志。

要列出系统中所有已激活的定时器及其下次触发时间,可以使用以下命令:

1

systemctl list-timers

这个命令会列出所有定时器单元,包括激活时间和下次触发时间,便于用户全面了解系统中的定时任务。

查看定时器日志

systemd 使用 journald 记录日志信息,用户可以通过查看日志来调试和监控定时器的执行情况。

要查看定时器关联的服务单元的日志,可以使用以下命令:

1

journalctl -u backup.service

这个命令会显示服务单元的所有日志信息,包括启动、停止和执行过程中产生的日志。

要查看定时器单元本身的日志,可以使用以下命令:

1

journalctl -u backup.timer

这个命令会显示定时器单元的所有日志信息,包括触发时间和相关事件。

要实时查看定时器或服务单元的日志,可以使用 -f 选项,例如:

1

journalctl -u backup.service -f

这个命令会实时显示服务单元的日志信息,便于用户监控任务的执行情况。

调试定时器问题

在使用 systemd 定时器时,可能会遇到一些问题。通过以下方法,可以有效地排查和解决定时器相关的问题。

首先,检查定时器和服务单元文件的配置是否正确。确保 OnCalendar 等属性设置合理,并且文件路径和命令正确无误。

使用 systemctl status 命令检查定时器和服务单元的状态,查看是否有错误信息或异常情况:

1

2

systemctl status backup.timer

systemctl status backup.service

使用 journalctl 命令查看定时器和服务单元的日志,查找错误信息和警告:

1

2

journalctl -u backup.timer

journalctl -u backup.service

日志中可能包含错误信息、失败原因和调试信息,有助于快速定位和解决问题。

手动启动关联的服务单元,确保其能够正常执行:

sudo systemctl start backup.service

如果服务单元无法正常执行,检查脚本或命令是否存在问题,确保其在独立运行时能够正常完成任务。

在服务单元文件中设置 Environment=SYSTEMD_LOG_LEVEL=debug,以启用详细的 debug 日志级别,有助于深入分析和调试问题。

编辑服务单元文件 backup.service,添加 Environment 行:

1

2

3

4

5

6

[Unit]

Description=Run backup script

[Service]

ExecStart=/path/to/backup-script.sh

Environment=SYSTEMD_LOG_LEVEL=debug

保存文件后,重新加载 systemd 配置:

1

2

sudo systemctl daemon-reload

sudo systemctl restart backup.service

查看 debug 日志:

1

journalctl -u backup.service

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用rsync+jenkins实现服务自动部署全流程

项目背景:城市政务云服务器没有上k8s,所有后端服务都是原始方式部署启动 (java -jar xxx.jar),那么有没有方式简化部署难度,实现自动部署?当然是有的,下面详细介绍(以Cen…

开源实战分享 | 新书:《大型语言模型实战手册》随书代码分享

《大型语言模型实战手册》(英文版)目前电子版在亚马逊有售,纸质版预计在2024年10月15日开售。该书通过超过275张定制插图,深入探索大型语言模型的世界,为Python开发者提供使用大型语言模型所需的实用工具和概念。 如果对于插图没有特别执念的…

Jupyter的使用分享

文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候,发现大家对于pycharm更容易上手(可能是比较好设置中文的原因),在…

【HTML】img标签和超链接标签

文章目录 img 标签src 属性alt 属性title 属性width/height 属性border 属性 超链接标签:a表格标签合并单元格 img 标签 img 是一个单标签 src 属性 img 标签必须搭配 src 使用(指定图片的路径) 相对路径: ./xxx.png./img/xxx.…

MyBatis的注入问题

对之前文章的补充:MyBatis中的#{}与${}注入问题----原文链接 前言: MyBatis是一个流行的Java持久层框架,用于将对象与数据库中的数据进行映射。然而,如果不当使用,MyBatis也可能受到诸如SQL注入这类的安全问题的影响。…

60天持仓法则:Aberration策略如何实现市场盈利

近期,我们频繁探讨的焦点多集中于短线交易的策略与技巧。今天,让我们转换视角,来聊聊中长线交易策略。中长线交易通常需要交易员有充足的耐心和严格的风控管理能力,才能在多变的市场里赢取利益。在中长线交易中趋势仍然是分析重点…

为什么做谷歌seo廉价服务无法带来真正的效果?

谷歌SEO是一个复杂且技术含量高的过程,涉及到人力、技术、以及外链资源等多个方面。这些元素的组合使得SEO服务不可能是廉价的。如果有人向您推荐廉价的SEO服务,您需要保持警惕,因为这样的服务通常效果甚微,甚至可能对您的网站造成…

华为OD机试 - 模拟商场优惠打折(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

CHI write 传输——CHI(5)

上篇介绍了dataless的操作类型,本篇我们来介绍一下write 一、Write 操作概览 cache stash :一种投机行为,通过在其未来的使用点附近分配一个cacheline来提高系统性能,因为可以减少使用数据时的内存访问延迟 二、CopyBack CopyB…

CRM如何助力企业内部高效管理?

企业内部的高效管理不仅是提升竞争力的关键,也是实现企业可持续发展的基石。客户关系管理(CRM)系统,作为连接客户与企业内部流程的重要桥梁,其在促进企业内部高效管理方面的作用日益凸显。通过自动化工作流程、跨部门信…

19.第二阶段x86游戏实战2-寻找寻路call

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

使用powershell的脚本报错:因为在此系统中禁止执行脚本

1.添加powershell功能环境: 2.启动powershell的执行策略 因为在此系统中禁止执行脚本。 set-executionpolicy unrestricted

leetcode每日一题day19(24.9.29)——买票需要的时间

思路:在最开始的情况下每人需要买的票数减一是能保持相对位置不变的, 如果再想减一就有可能 有某些人只买一张票,而离开了队伍, 所有容易想到对于某个人如果比当前的人买的多就按当前的人数量算 因为在一次次减一的情况下&#xf…

风险函数梳理工具

风险函数梳理工具 在日常的软件开发工作中,代码的安全性和质量至关重要。然而,面对庞大的代码库,手动查找潜在的风险函数不仅耗时,而且容易出错。特别是在团队协作中,代码审查和重构工作往往占据了大量宝贵的时间&…

【机器学习】---异构数据融合

文章目录 1. 引言2. 异构数据融合的概念3. 常用的异构数据融合技术3.1 早期融合(Early Fusion)3.2 晚期融合(Late Fusion)3.3 中期融合(Intermediate Fusion)3.4 递归融合(Recursive Fusion&…

JavaSE——进制转换、原码、反码、补码、位运算(左移、右移、取反)

目录 一、四种进制介绍 二、进制的转换 (一)二进制—>十进制 (二)八进制—>十进制 (三)十六进制—>十进制 (四)十进制—>二进制 (五)十进制—>八进制 (六)十进制—>十六进制 (七)二进制—>八进制 (八)二进制—>十六进制 (九)八进制—>二…

免费升级!Windows10 64位国庆特别版:包含最新安全补丁!

国庆佳节临近,系统之家小编给大家带来了Windows10 64位国庆特别版,该版本系统以最新Windows10 22H2专业版系统为基础,展开离线制作与优化,安全无毒,且运作更加流畅稳定,建议大家升级。Windows10 64位国庆特…

华为OD机试 - 三阶积幻方(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

长沙惠科成功完成SAP S/4 1511到S/4 2021的无缝升级,实现“停机不停产”

关于HKC长沙惠科光电有限公司 长沙惠科光电有限公司于2019年9月20日落户于长沙市浏阳经济技术开发区,注册资本220亿元人民币,由惠科股份有限公司与湖南金阳投资集团、浏阳市城市建设集团有限公司共同出资,是惠科股份有限公司下属的第四家专业…

WebAssembly 为什么能提升性能,怎么使用它 ?

文章目录 简介:起源:前端性能提升历史JIT(Just-In-Time)编译器(即时编译) 为什么需要WebAssembly:WebAssembly能做什么:经常说WASM的性能高,为什么高??使用方法:Emscript…