主页
手机版
扫描查看手机站
所在位置:首页 → 教程资讯 → 使用systemd timer管理Linux定时任务

使用systemd timer管理Linux定时任务

发布: 更新时间:2024-04-16 08:52:19

哈喽大家好,我是咸鱼。

说到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

    单元。

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命令设置开机自启动失败》

设置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小时执行一次任务。

官方文档:
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

软件上新 查看更多