服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Linux systemd 定时任务原理解析

Linux systemd 定时任务原理解析

2024-04-16 12:15咸鱼Linux运维 Linux

说到 Linux 定时任务,大家用得最多的就是 crond 服务,但其实 systemd 也有类似的功能,我们不但可以通过 systemd 来管理服务,还能设置定时任务,那就是 systemd timer,接下来通过本文介绍Linux systemd 定时任务的相关知识,需要

哈喽大家好,我是咸鱼。

说到 Linux 定时任务,大家用得最多的就是 crond 服务,但其实 systemd 也有类似的功能。我们不但可以通过 systemd 来管理服务,还能设置定时任务,那就是 systemd timer。

与 crond 相比,systemd 定时任务具有以下优点:

  • 更高的精度:systemd 定时任务可以精确到秒,而 crond 只能精确到分钟。
  • 可以限制资源使用:使用 systemd 定时任务可以设置内存和 CPU 的使用限制,比如最多使用 50% 的 CPU。
  • 更灵活的配置:systemd 定时任务可以通过条件、依赖关系等进行配置,以控制任务的执行。相比之下,crond 的配置相对简单,灵活性较低。

举个例子,假设我们要通过 crond 配置多个大文件的远程备份(使用 scp、rsync 或 ftp 的方式),但由于大文件的网络传输时间不确定,因此下一个文件的备份任务开始时间几乎都是按照经验估计的。

这可能导致上一个任务的网络传输尚未完成,下一个任务已经开始,同时占用网络带宽,然后又启动了下一个任务,形成恶性循环。

而使用 systemd timer 可以建立任务之间的依赖关系,例如在第一个备份任务完成后再启动第二个备份任务,以此类推。

systemd timer 原理

systemd 定时任务基于 systemd 的单元管理器。它使用两种类型的单元来管理定时任务:.timer 单元和 .service 单元。

  • .timer 单元:
    • .timer 单元定义了定时规则,包括启动时间、间隔时间等。
    • 每个 .timer 单元都对应一个或多个关联的 .service 单元。
  • .service 单元:
    • .service 单元定义了要在计时器触发时运行的服务或命令。
    • 当 .timer 触发时,相关联的 .service 单元将被启动。

systemd 定时任务原理是:systemd 定期检查每个 .timer 单元中定义的定时规则,以确定是否触发相应的定时器。一旦定时器触发,systemd 将启动与该定时器关联的 .service 单元,从而执行预定的任务。

在正式介绍 systemd 定时任务之前,我们先要了解什么是单元(unit)。

systemd 单元

简单来讲,单元就是 systemd 的最小管理单位,是单个进程的描述。一个个单元相互调用和依赖,组成一个庞大的任务管理系统。

systemd 中的 unit 有很多类型,下面是一些常见的 unit 类型:

  • .service:service 单元,也就是我们常说的系统服务
  • .target:target 单元,其实就是一堆 unit 的集合,比如常见的 multi-user.target
  • .timer:timer 单元,负责定时任务。
  • .slice:slice 单元,负责资源的分配。

每个 unit 都有一个描述文件(unit 负责干什么、怎么干...),它们分散在三个目录:

  • /lib/systemd/system:系统默认的 unit 文件
  • /etc/systemd/system:包含用户自定义的 unit 文件,如果设置了开机自启动,则该目录下的 unit 描述文件会创建一个符号链接。
  • /usr/lib/systemd/system:用户自己定义的 unit 文件,也会包含一些系统默认的 unit 文件

大多数 linux 发行版中 /lib 是 /usr/lib的软链接,所以 1 和 3 其实是同一目录,作用自然应该是相同的。

其实可以简单分成两类:

  • /etc/systemd/system:用户自定义的 unit 文件
  • /usr/lib/systemd/system:系统默认的 unit 文件和用户安装软件的 unit 文件
# 查看所有 unit
$ systemctl list-unit-files
# 查看所有 Service unit
$ systemctl list-unit-files --type service
# 查看所有 Timer unit
$ systemctl list-unit-files --type timer

关于 systemd unit 相关的内容这里就不细讲了,大家可以看我之前的文章:《利用systemctl管理Tomcat启动、停止、重启及开机启动详解》

设置 systemd 定时任务

有一个检查 https 证书是否过期的脚本 check_https.sh,我们现在需要系统定期执行这个脚本,除此之外,系统在开机之后也会执行这个脚本。

首先创建一个 service unit

[root@localhost ~]# cat /usr/lib/systemd/system/check-https.service
[Unit]
Description=check https certificates

[Service]
Type=oneshot
ExecStart=check_https.sh

[Install]
WantedBy=multi-user.target

Type=oneshot 表示 service 以一次性(Oneshot)方式运行。这意味着当启动 service 时,它将执行一次,并在完成后退出。

然后我们创建一个 timer unit

Service unit 只是定义了如何执行任务,要定时执行这个 Service,还必须定义 Timer unit

[root@localhost ~]# cat /usr/lib/systemd/system/check-https.timer
[Unit]
Description=Runs check https every day
[Timer]
OnUnitActiveSec=24h
Unit=check-https.service
[Install]
WantedBy=multi-user.target

我们着重来看下 [Timer] 部分:

  • OnActiveSec:定时任务生效后,多少时间开始执行任务
  • OnBootSec:系统启动后,多少时间开始执行任务
  • OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
  • OnUnitActiveSec:该 unit 上次执行后,等多少时间再次执行
  • OnUnitInactiveSec: 定时任务上次关闭后多少时间,再次执行
  • OnCalendar:基于绝对时间,而不是相对时间执行
  • AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
  • Unit:真正要执行的任务,默认是同名的带有.service 后缀的 unit
  • Persistent:如果设置了该字段,即使定时任务到时没有启动,也会自动执行相应的 unit
  • WakeSystem:如果系统休眠,是否自动唤醒系统

上面的 timer 文件里,OnUnitActiveSec=24h 表示 24 小时执行一次任务。

下面是其他的写法:

1、在系统启动 15 分钟后执行,并在系统运行时,每周执行一次

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w
Unit=check-https.service

2、每周周一执行,如果到时定时任务没有启动,会立即执行

[Timer]
OnCalendar=weekly
Persistent=true
Unit=check-https.service

3、每周日凌晨三点执行(时间格式:Year-Month-Day Hour:Minute:Second

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Unit=check-https.service

官方文档:https://www.freedesktop.org/software/systemd/man/latest/systemd.time.html

然后我们启动这个定时任务,并设置开机自启动

# 重新加载配置
systemctl  daemon-reload
systemctl start check-https.timer
systemctl enable check-https.timer

其他一些定时任务命令:

# 查看所有正在运行的定时任务
systemctl list-timers
# 关闭定时任务
systemctl stop check-https.timer
# 查看定时任务状态
systemctl status check-https.timer

到此这篇关于Linux systemd 定时任务的文章就介绍到这了,更多相关Linux systemd 定时任务内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/edisonfish/p/18136713

延伸 · 阅读

精彩推荐
  • Linux在Linux系统上安装Linux内核头文件的教程

    在Linux系统上安装Linux内核头文件的教程

    这篇文章主要介绍了在Linux系统上安装内核头文件的教程,尤其是在Linux作为服务器安装驱动时尤为有用,需要的朋友可以参考下 ...

    Linux教程网5782019-09-29
  • Linux做linux计划任务的步骤

    做linux计划任务的步骤

    这篇文章主要介绍了做linux计划任务的步骤,需要的朋友可以参考下 ...

    linux教程网3462019-11-12
  • Linux使用wget递归镜像网站

    使用wget递归镜像网站

    wget这个命令可以以递归的方式下载整站,并可以将下载的页面中的链接转换为本地链接。...

    lon.y10822022-01-24
  • Linuxlinux之如何查看进程占用网速和流量使用情况

    linux之如何查看进程占用网速和流量使用情况

    这篇文章主要介绍了linux之如何查看进程占用网速和流量使用情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐...

    现实、太残忍3542023-04-16
  • LinuxLinux 日期和时间操作详解

    Linux 日期和时间操作详解

    Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。linux如何 修改时间,查看时间,设置时间。本文将提供详细的操作方法,需要的朋...

    Linux教程网2982019-12-14
  • LinuxLinux危机四伏!

    Linux危机四伏!

    撰稿 | 王瑞平 Linux桌面版虽然在上半年小火了一下,但危机大于成绩。 别的不说,微软对于“云桌面计划”的执着从未消却,致力于把用户从PC Windows转移...

    51CTO技术栈122023-08-07
  • Linuxlinux硬盘检测健康状态

    linux硬盘检测健康状态

    定期检查硬盘的健康状态是每个系统管理员必须要做的事情。说到硬盘的健康状态,这里就得先说一下SMART,SMART是一种磁盘自我分析检测技术 ...

    Linux教程网25132019-11-22
  • Linuxlinux下用Proftpd搭建ftp服务器及配置

    linux下用Proftpd搭建ftp服务器及配置

    linux下搭建ftp服务器的软件是wuftp,现在真的时代变了,上网看一下几乎全世界的人都用proftpd了!赶个潮流,我也用proftpd在公司的一台备用小服务器上装上...

    Linux教程网3972019-12-28