LinuxpythonCentOS

systemd定时器代替cron定时任务

2021-04-24  本文已影响0人  刘小白DOER

    平时笔者使用cron来完成定时任务,systemd 的定时器也可以完成cron定时任务,而且相对于cron,功能更加丰富,但是也是更加复杂。

    与 cron 定时任务类似,systemd 的定时器可以在特定的时间间隔触发完成事件。但是systemd定时器可以做到 cron定时任务无法做到的事情,比如systemd服务等特定事件发生后的一段时间后触发完成事件。关于cron定时任务请参考文章-Linux crontab定时任务详细分解。

    先来看看centos8的systemd timer。

     systemctl list-timers可以罗列出centos8系统所有自带运行的的timer,目前有dnf-makecache.timer、 unbound-anchor.timer、systemd-tmpfiles-clean.timer。

    可以通过systemctl cat systemd-tmpfiles-clean.timer来查查看systemd-tmpfiles-clean.timer的内容,具体timer执行的服务就是在systemd-tmpfiles-clean.service定义的。timer里定义了两种情况会执行该服务:开机15分钟执行服务和距离上次执行该服务1天后执行服务。

systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

    上面的三个timer在哪里呢,下面是centos8的三个单元文件的目录,自带的三个timer是属于系统默认的单元文件 ,同时它们的service也在系统默认的单元文件 /lib/systemd/system目录下。

/lib/systemd/system:系统默认的单元文件    

/usr/lib/systemd/system:用户自己定义的单元文件

/etc/systemd/system:用户安装的软件的单元文件

    现在我们来建立一个timer来测试,在/usr/lib/systemd/system目录下建立service和timer文件。下面的代码是基于微信公众号文章-使用 systemd 定时器代替 cron 作业 | Linux 中国 。

free_memory_monitor.service

[Unit]

Description=Logs system statistics to the systemd journal

Wants= free_memory_monitor.timer

[Service]

Type=oneshot

ExecStart=/usr/bin/free -m

[Install]

WantedBy=multi-user.target

    systemd 服务单元执行程序的标准输出(STDOUT)会被发送到系统日志中,可以使用journalctl来查看相关日志信息。

free_memory_monitor.timer:

[Unit]

Description=Logs some system statistics to the systemd journal

Requires=free_memory_monitor.service

[Timer]

Unit=free_memory_monitor.service

OnCalendar=*-*-* *:*:00

[Install]

WantedBy=timers.target

    timer定时器基于绝对时间,在每分钟执行一次。[Timer]的字段还有如下几种。

启动timer:sudo systemctl start free_memory_monitor.timer

journalctl查看日志: sudo journalctl -u free_memory_monitor.service,也可以查看timer的日志: sudo journalctl -u free_memory_monitor.timer。为了精确定位到日志信息, journalctl -S today -f -u  free_memory_monitor.service 来实时查看今天开始的日志。日志的保存位置是/var/log/messages,即绝大多数的系统日志都记录到该文件。

    注意日志的时间,定时器并不是精确在每分钟的 00 秒执行的,每次执行的时间间隔都不是刚好一分钟。timer这样执行的原因是为了防止多个服务在完全相同的时刻被触发,被设计成在规定时间附近随机波动的时间点触发。

    可以在timer文件中的[Timer]中添加声明来指定更高的触发时间跨度精确度,AccuracySec=1us,精确到微秒以内。如下是修改后的日志,可以看到日志时间都变成了00。

    监控内存状况的话需要设置开机启动:systemctl enable  free_memory_monitor.timer ,设置完成后可以在/etc/systemd/system/timers.target.wants找软连接,让timer 开机后定时调用free_memory_monitor.service服务。

上一篇下一篇

猜你喜欢

热点阅读