发布: 更新时间:2024-04-16 08:52:19
哈喽大家好,我是咸鱼。
说到Linux定时任务,大家用得最多的就是crond服务,但其实systemd也有类似的功能。我们不但可以通过systemd来管理服务,还能设置定时任务,那就是systemd timer。
与crond相比,systemd定时任务具有以下优点:
举个例子,假设我们要通过crond配置多个大文件的远程备份(使用scp、rsync或ftp的方式),但由于大文件的网络传输时间不确定,因此下一个文件的备份任务开始时间几乎都是按照经验估计的。
这可能导致上一个任务的网络传输尚未完成,下一个任务已经开始,同时占用网络带宽,然后又启动了下一个任务,形成恶性循环。
而使用systemd timer可以建立任务之间的依赖关系,例如在第一个备份任务完成后再启动第二个备份任务,以此类推。
systemd定时任务基于systemd的单元管理器。它使用两种类型的单元来管理定时任务:
.timer
.service
systemd定时任务原理是:
systemd定期检查每个
.timer
单元中定义的定时规则,以确定是否触发相应的定时器。一旦定时器触发,systemd将启动与该定时器关联的
.service
单元,从而执行预定的任务。
在正式介绍systemd定时任务之前,我们先要了解什么是单元(unit)。
简单来讲,单元就是systemd的最小管理单位,是单个进程的描述。一个个单元相互调用和依赖,组成一个庞大的任务管理系统。
systemd中的unit有很多类型,下面是一些常见的unit类型:
.service
.target
multi-user.target
.timer
.slice
每个unit都有一个描述文件(unit负责干什么、怎么干...),它们分散在三个目录:
/lib/systemd/system
/etc/systemd/system
/usr/lib/systemd/system
大多数linux发行版中
/lib
是
/usr/lib
的软链接,所以1和3其实是同一目录,作用自然应该是相同的。
其实可以简单分成两类:
/etc/systemd/system
/usr/lib/systemd/system
# 查看所有unit
$ systemctl list-unit-files
# 查看所有Service unit
$ systemctl list-unit-files --type service
# 查看所有Timer unit
$ systemctl list-unit-files --type timer
关于systemd unit相关的内容这里就不细讲了,大家可以看我之前的文章:《systemctl命令设置开机自启动失败》
有一个检查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
OnUnitActiveSec
OnUnitInactiveSec
OnCalendar
AccuracySec
Unit
.service
Persistent
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