美文网首页LinuxpythonCentOS
systemd定时器代替cron定时任务

systemd定时器代替cron定时任务

作者: 刘小白DOER | 来源:发表于2021-04-24 21:51 被阅读0次

        平时笔者使用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服务。

    相关文章

      网友评论

        本文标题:systemd定时器代替cron定时任务

        本文链接:https://www.haomeiwen.com/subject/ncvhrltx.html