快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

体育投注十大平台_酒文化网进入



关键词:

arm

imx8x

nxp

systemd准时器

择要:准时器义务在 Linux 系统中是一项很普遍的利用,例如按期清理文件,在嵌入式系统则可以准时调用义务采集数据等。Cron 是一个广为人知的准时计划义务治理器,但跟着systemd 兴起,systemd timers 也徐徐开始取代传统的 cron。本文就将基于Toradex Linux BSP在Colibri iMX8X 上如应用 systemd 准时器。

1). 简介

准时器义务在 Linux 系统中是一项很普遍的利用,例如按期清理文件,在嵌入式系统则可以准时调用义务采集数据等。Cron 是一个广为人知的准时计划义务治理器,但跟着systemd 兴起,systemd timers 也徐徐开始取代传统的 cron。本文就将基于Toradex Linux BSP在Colibri iMX8X 上如应用 systemd 准时器。

Systemd 准时器从触发光阴上可以分为两种:

•单调准时器:从一个特定的光阴开始后过一段光阴触发,平日可所以系统启动或者systemd 办事单元履行的开始光阴

•实时准时器:在某个特准光阴触发,一样平常指时钟光阴,这个就类似于cron准时义务

两种准时满意不合要求的义务,例如必要在某个明确并固定的光阴来履行义务,如每周日晚上12点清理日志文件,则可以选择实时准时器。而对付有些无法实现猜测履行光阴,平日是要在系统启动后才按期履行,如某个义务在启动后每隔10分钟采样传感器数据,因为不确定系统启动光阴,所有可以采纳单调准时器。或者同时应用两个准时器功能。

Systemd 准时器的设置设置设备摆设摆设文件可以分为两部分,准时器单元以 .timer 后缀的systemd单元文件,以及办事单元以 .service 后缀的systemd单元文件。每个 .timer 文件平日对应一个同名的 .service 文件。准时器单元 .timer 文件中的 [Timer] 定义了该准时器何时以及若何触发。该准时器被触发后,履行对应的办事单元 .service,此中的 [Service] 定义了终极被履行的脚本或者利用。下面我们将演示若何应用。

2). 单调准时器

我们将设置一个系统启动 2 分钟后启动并在此之后每隔 15 分钟按期履行的准时义务。下面是所需的准时器单元 test1.timer 和办事单元 test1.service。

./ test1.timer

-----------------------------------------

[Unit]

Description=Run every 15min and on boot[Timer]

OnBootSec=2min

OnUnitActiveSec=15min[Install]

WantedBy=timers.target

-----------------------------------------

./ test1.service

-----------------------------------------

[Unit]

Description=Hello World

[Service]

ExecStart=/home/root/HelloWorld

-----------------------------------------

在 .timer 中 OnBootSec= 设置了该准时器必要在系统启动 2 分钟后被履行,OnUnitActiveSec= 设置了该准时器在成功履行后,每隔 15 分钟必要再次被履行。办事单元 test1.service 中 [Service] 定义了 /home/root/HelloWorld 是必要被履行的利用。

把上面两个文件复制到 /etc/system/systemd 目录下,systemd-analyze 敕令来核对文件是否有效。

-----------------------------------------

root@colibri-imx8x:/etc/systemd/system# systemd-analyze verify test1*

# 启用 test1 准时义务,并在每次启动后都生效。设置完成后顿时重启,查看该义务。

root@colibri-imx8x:/etc/systemd/system# systemctl start test1.timer

root@colibri-imx8x:/etc/systemd/system# systemctl enable test1.timer

root@colibri-imx8x:/etc/systemd/system# sync

root@colibri-imx8x:/etc/systemd/system# reboot

# 敕令 systemctl list-timers 可以列出今朝激活的准时义务。

root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLAST PASSED UNITACTIVATES

Tue 2020-02-11 16:39:19 CST1min 30s left n/an/atest1.timertest1.service

Tue 2020-02-11 16:52:19 CST14min leftn/an/asystemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service2 timers listed.

Pass --all to see loaded but inactive timers, too.

-----------------------------------------

可以看到在系统启动后,还剩下1分30秒履行test1.service,这个是由 OnBootSec=2min 参数所设置的。

在等待数分钟再次查看准时器义务,test1.service 在14分钟后会被履行,这是由 OnUnitActiveSec=15min 参数所设置。

-----------------------------------------

root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLASTPASSEDUNITACTIVATES

Tue 2020-02-11 16:52:19 CST12min left n/an/asystemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

Tue 2020-02-11 16:54:28 CST14min left Tue 2020-02-11 16:39:28 CST26s ago test1.timertest1.service

-----------------------------------------

从系统日志里也可以察看到自16:37:25 系统启动后,在 16:39:28 时 HelloWorld 被履行。

-----------------------------------------

root@colibri-imx8x:~# journalctl -u test1.service

-- Logs begin at Tue 2020-02-11 16:37:25 CST, end at Tue 2020-02-11 16:40:49 CST. --

Feb 11 16:39:28 colibri-imx8x systemd[1]: Started Hello World.

Feb 11 16:39:28 colibri-imx8x HelloWorld[3982]: Hello world!

-----------------------------------------

再次等待 15 分钟今后,从新查看日志和准时器义务,在 16:54:30 时HelloWorld 被履行,并且在 13 分钟后会再次履行。这相符准时器义务 test1 的设置预期。

-----------------------------------------

root@colibri-imx8x:~# journalctl -u test1.service

-- Logs begin at Tue 2020-02-11 16:37:25 CST, end at Tue 2020-02-11 16:56:21 CST. --

Feb 11 16:39:28 colibri-imx8x systemd[1]: Started Hello World.

Feb 11 16:39:28 colibri-imx8x HelloWorld[3982]: Hello world!

Feb 11 16:54:30 colibri-imx8x systemd[1]: Started Hello World.

Feb 11 16:54:30 colibri-imx8x HelloWorld[4112]: Hello world!root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLASTPASSEDUNITACTIVATES

Tue 2020-02-11 17:09:30 CST13min left Tue 2020-02-11 16:54:30 CST1min 31s ago test1.timertest1.service

Wed 2020-02-12 16:52:20 CST23h leftTue 2020-02-11 16:52:20 CST3min 42s ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

-----------------------------------------

3). 实时准时器

这里我们将设置在每个小时第10分钟被履行的实时准时义务。下面是所需的准时器单元 test2.timer 和办事单元 test2.service。

./ test2.timer

-----------------------------------------

[Unit]

Description=Run each 10min of hours[Timer]

OnCalendar=*-*-* *:10:00[Install]

WantedBy=timers.target

-----------------------------------------

./ test2.service

-----------------------------------------

[Unit]

Description=Hello Toradex[Service]

ExecStart=/home/root/HelloToradex

-----------------------------------------

在 test2.timer 中,OnCalendar= 设置准时器义务触发的光阴。OnCalendar 的光阴款式为 DayOfWeek Year-Month-Day Hour:Minute体育投注十大平台:Second。

此中 weekday 部分是可以省略的,准时器不匹配礼拜几,由后面的日期和光阴部分来指定。假如填写则必须是英文中礼拜的缩写或者全称,如礼拜二是 Web 或者 Wednesday。可以应用 “,”,来指定多个礼拜天如Mon,Web,Fri。“..”用于指定继续的一段光阴,如Mon..Fri 指从周一到周五。“,”和“..”还可以混杂应用来指定一周的几天。

日期和光阴部分,可以应用 “*” 表示任何相符的日期或者光阴。如 2020-*-* 1:23:00 表示2020 年中天天的 1:23:00 光阴触发准时器义务。也可以应用 “,” 来指定详细的而光阴或日期,2020-1,2-* 1,2:23:00 表示 2020 年中1 月和 2 月天天的1:23:00 和 2:23:00 触发准时器义务。日期、光阴还有多种表达要领,包括时区,详细可以查看文章着末的参考链接。

在 .timer 中 OnCalendar=*-*-* *:10:00 将准时器设置为天天每小时第 10 分钟触发。

同样将上述两个文件复制到 /etc/systemd/system 目录,并启动该准时器。

-----------------------------------------

root@colibri-imx8x:/etc/systemd/system# systemctl enable test2.timer

root@colibri-imx8x:/etc/systemd/system# systemctl start test2.timer

# 系统当前光阴是 17:29:28,间隔18:10:00 还有 40 分钟,是以在 40 分钟后test2 准时器将被触发。

root@colibri-imx8x:~# date

Tue Feb 11 17:29:28 CST 2020

root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLAST PASSED UNITACTIVATES

Tue 2020-02-11 17:41:57 CST12min left n/an/asystemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

Tue 2020-02-11 18:10:00 CST40min left n/an/atest2.timertest2.service2 timers listed.

Pass --all to see loaded but inactive timers, too.

# 在等待一段光阴后,查看日志,18:10:01 的时刻 test2 准时器被触发,并履行 /home/root/HelloToradex 法度榜样。

root@colibri-imx8x:~# journalctl -u test2.service

-- Logs begin at Tue 2020-02-11 17:27:02 CST, end at Tue 2020-02-11 18:11:11 CST. --

Feb 11 18:10:01 colibri-imx8x systemd[1]: Started Hello Toradex.

Feb 11 18:10:01 colibri-imx8x HelloToradex[4277]: Hello Toradex!

# 而距下一次触发的光阴 19:10:00 还有一个小时。

root@colibri-imx8x:/etc/systemd/system# date

Tue Feb 11 18:10:43 CST 2020root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLASTPASSEDUNITACTIVATES

Tue 2020-02-11 19:10:00 CST59min left Tue 2020-02-11 18:10:01 CST47s agotest2.timertest2.service

Wed 2020-02-12 17:41:58 CST23h leftTue 2020-02-11 17:41:58 CST28min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service2 timers listed.

Pass --all to see loaded but inactive timers, too.

# 那么在一个小时再次查看日志文件,19:10:09 的时刻 test2 准时器被触发。

root@colibri-imx8x:~# journalctl -u test2.service

-- Logs begin at Tue 2020-02-11 17:27:02 CST, end at Tue 2020-02-11 19:23:40 CST. --

Feb 11 18:10:01 colibri-imx8x systemd[1]: Started Hello Toradex.

Feb 11 18:10:01 colibri-imx8x HelloToradex[4277]: Hello Toradex!

Feb 11 19:10:09 colibri-imx8x systemd[1]: Started Hello Toradex.

Feb 11 19:10:09 colibri-imx8x HelloToradex[4689]: Hello Toradex!

-----------------------------------------

4). 混杂准时器

除了上面零丁应用单调或者实时准时器外,我们还可以同时使用两种准时器设置设置设备摆设摆设属性。

./ test3.timer

-----------------------------------------

[Unit]

Description=Run each 10min of hours and on boot[Timer]

OnBootSec=2min

OnCalendar=*-*-* *:10:00[Install]

WantedBy=timers.target

-----------------------------------------

./ test3.service

-----------------------------------------

[Unit]

Description=Hello Torizon[Service]

ExecStart=/home/root/HelloTorizon

-----------------------------------------

这里 test3 准时器首先经由过程 OnBootSec=2min 设置为系统启动后 2 分钟触发,并且由 OnCalendar=*-*-* *:10:00 设置在每个小时第10分钟被履行的实时准时义务。这两个参数分手来自单调准时器和实时准时器设置设置设备摆设摆设。

-----------------------------------------

# 启动该准时器后重启系统

root@colibri-imx8x:/etc/systemd/system# systemctl enable test3.timer

root@colibri-imx8x:/etc/systemd/system# sync

root@colibri-imx8x:/etc/systemd/system# reboot

# 系统启动后看到 test3 将会在 1 分 43 秒后触发。

root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLAST PASSED UNITACTIVATES

Tue 2020-02-11 19:27:30 CST1min 42s left n/an/atest3.timertest3.service

Tue 2020-02-11 19:40:30 CST14min leftn/an/asystemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

# 在等待 2 分钟后,test3 已经被触发,并会在42 分钟后再次触发,即 20:10:00。

root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLASTPASSEDUNITACTIVATES

Tue 2020-02-11 19:40:30 CST12min left n/an/asystemd-tmpfiles-clean.timer systemd-tmpf体育投注十大平台iles-clean.service

Tue 2020-02-11 20:10:00 CST42min left Tue 2020-02-11 19:27:31 CST19s ago test3.timertest3.service

# 从日志中看到,系统在 19:25:35 阁下启动,在其后 2 分钟 19:27:31 触发了test3 并履行 /home/root/HelloTorizon。

root@colibri-imx8x:~# journalctl -u test3.service

-- Logs begin at Tue 2020-02-11 19:25:35 CST, end at Tue 2020-02-11 19:28:09 CST. --

Feb 11 19:27:31 colibri-imx8x systemd[1]: Starte体育投注十大平台体育投注十大平台d Hello Torizon.

Feb 11 19:27:31 colibri-imx8x HelloTorizon[4002]: Hello Torizon!

# 在等到 20:10:00 后查看准时器义务,test3 如预期在 20:10:04 的时刻被触发,44 分钟后下一次触发。

root@colibri-imx8x:~# systemctl list-timers

NEXTLEFTLASTPASSEDUNITACTIVATES

Tue 2020-02-11 21:10:00 CST44min left Tue 2020-02-11 20:10:04 CST15min ago test3.timertest3.service

Wed 2020-02-12 19:40:31 CST23h leftTue 2020-02-11 19:40:31 CST44min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

# 日志也记录了 20:10:04 时刻test3 被触发并履行 /home/root/HelloTorizon。

root@colibri-imx8x:~# journalctl -u test3.service

-- Logs begin at Tue 2020-02-11 19:25:35 CST, end at Tue 2020-02-11 20:25:26 CST. --

Feb 11 19:27:31 colibri-imx8x systemd[1]: Started Hello Torizon.

Feb 11 19:27:31 colibri-imx8x HelloTorizon[4002]: Hello Torizon!

Feb 11 20:10:04 colibri-imx8x systemd[1]: Started Hello Torizon.

Feb 11 20:10:04 colibri-imx8x HelloTorizon[4299]: Hello Torizon!

-----------------------------------------

到这里我们已经演示了不合类型准时器的应用措施,有些读者可能已经发明准时器义务被触发的光阴并不是很严格得按照所设定的光阴。例如上面 test3 在第二次被触发的光阴是 20:10:04,不是 20:10:00。这是由于 Toradex Linux BSP 默认是通俗的 Linux 内核,而非实时 Linux,这就导致在义务光阴分配上会存在必然的光阴哆嗦。其次,systemd 准时器中的 AccuracySec 参数默认是 1min,这设置了准时器的精度。准时器触发光阴窗口为OnCalendar=、OnActiveSec=、OnBootSec=、OnStartupSec=、OnUnitActiveSec= 所设置的光阴开始到 AccuracySec= 停止。这样做的目的是削减不需要的 CPU 唤醒,从而低落功耗。为了前进准时器精度,可以将 AccuracySec= 设置到最小的 1us。

为了避免在同一个光阴触发多个准时器义务,从而导致系统资本首要,可以应用 RandomizedDelaySec= 参数,为准时义务添加一个从 0 到 RandomizedDelaySec 的随机延时。

5). Systemd vs. Cron体育投注十大平台

上面的几个例子已经展示了 systemd 准时器的特征,其于传统的 Cron 对照如下:

优点:

./ Systemd 准时器可以使用 systemd 的依附关系(如等待收集连接、某个文件的创建、其他利用就位后履行义务)

./ 准时义务会被记录到journald 日志

./ 准时器义务可以在系统/利用启动后触发

./ 可以使用cgroups

./ 可以零丁履行义务而不依附准时器(.timer 和 .service 分开设置设置设备摆设摆设)

毛病:

./ 相对繁杂的设置设置设备摆设摆设历程,Cron 仅需一行敕令即可

./ Systemd 准时器默认不支持 MAILTO 功能

6). 总结

准时器义务作为嵌入式系统中常见的利用,systemd 准时器为用户供给更多的可设置设置设备摆设摆设功能以及优化选项。本文枚举了 systemd 准时器基础操作措施,以及和cron 比较,赞助用户更快得应用。更多的技巧细节和功能请参考下面的链接内容。

参考:

https://wiki.archlinux.org/index.php/Systemd/Timers

https://www.freedesktop.org/software/systemd/man/systemd.timer.html

https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.time.7

https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.timer.5

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: