0

我们有一个嵌入式目标环境(独立于主机构建环境),其中systemd正在运行但不是cron.

我们还有一个脚本,在大多数系统下,我只需创建一个cron条目以每五分钟运行一次。

现在我知道如何在下创建服务,但是systemd这个脚本是一次性的,它在完成工作后退出。我想做的是让它在启动时立即运行(syslog.target当然是在 之后),然后每五分钟运行一次。

阅读systemd计时器后,我创建了以下服务文件/lib/systemd/system/xyzzy.service

[Unit]
Description=XYZZY
After=syslog.target

[Service]
Type=simple
ExecStart=/usr/bin/xyzzy.dash

和等价物/lib/systemd/system/xyzzy.timer

[Unit]
Description=XYZZY scheduler

[Timer]
OnBootSec=0min
OnUnitActiveSec=5min

[Install]
WantedBy=multi-user.target

不幸的是,在启动目标时,计时器似乎没有启动,因为 的输出systemctl list-timers --all不包括它。手动启动计时器单元似乎可以正常工作,但这应该在用户干预下自动运行。

我原以为这WantedBy会确保计时器单元已安装并运行,因此会定期启动服务。但是,我注意到该multi-user.target.wants目录实际上没有计时器的符号链接。

这是如何完成的systemd

4

1 回答 1

1

计时器在您实际启用它之前是不活动的:

systemctl enable xyzzy.timer

如果你想在重启前看看它是如何工作的,你也可以启动它:

systemctl start xyzzy.timer

就在您不一定能够在引导时轻松运行任意命令(但可能控制文件系统内容)的单独目标环境执行此操作而言,您可以简单地创建相同的符号链接(在您的开发区域中)该enable命令会做。

例如(假设SYSROOT标识了目标文件系统的根目录):

ln -s ${SYSROOT}/lib/systemd/system/xyzzy.timer
      ${SYSROOT}/lib/systemd/system/multi-user.target.wants/xyzzy.timer 

这将有效地将计时器单元置于 的启用状态multi-user.target,因此systemd将使用该目标启动它。


此外,通常您的自定义文件将存储在/etc/systemd/system/. 等效lib目录旨在托管 systemd由软件包或操作系统安装的文件。

如果您的 cron 作业每 5 分钟精确运行一次很重要,您应该检查准确性,因为systemd 的单调计时器可能会随着时间的推移而滑动

于 2017-01-10T17:56:09.973 回答