我如何使用systemd替换打算每五分钟运行一次的cron作业?

我如何使用systemd替换打算每五分钟运行一次的cron作业?,cron,systemd,periodic-task,Cron,Systemd,Periodic Task,我们有一个嵌入式目标环境(独立于主机构建环境),其中运行的是systemd,而不是cron 我们还有一个脚本,在大多数系统中,我只需创建一个cron条目,每五分钟运行一次 现在我知道了如何在systemd下创建服务,但这个脚本是一个一次性脚本,在完成工作后退出。我想做的是让它在引导时立即运行(当然是在syslog.target之后),然后每隔五分钟运行一次 在阅读了systemd计时器之后,我创建了以下服务文件/lib/systemd/system/xyzy.service: [Unit] De

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

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

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

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

[Unit]
Description=XYZZY
After=syslog.target

[Service]
Type=simple
ExecStart=/usr/bin/xyzzy.dash
和等效的
/lib/systemd/system/xyzy.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
中如何执行此操作?

在您实际启用计时器之前,计时器不会处于活动状态:

systemctl enable xyzzy.timer
如果要在重新启动前查看其工作方式,还可以启动它:

systemctl start xyzzy.timer
对于一个单独的目标环境,您不一定能够在引导时轻松地运行任意命令(但可能控制文件系统内容),您可以简单地创建与
enable
命令相同的符号链接(在您的开发区域中)

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

这将有效地将定时器单元置于启用状态,以便
多用户.target
,因此
systemd
将使用该目标启动定时器单元


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


如果cron作业每5分钟精确运行一次很重要,那么您应该检查其准确性,因为这相当烦人。考虑到
systemd
的全部目的是处理启动活动,我们需要手动启动它,或者使用其他启动时工具来启动它?也许我在问题中没有说得很清楚,但是目标环境与开发是分开的,所以在我的开发环境中运行它并不是一件简单的事情,因为这不会影响目标环境。我需要做的是确保目标在引导后不受干预地执行此操作。有点令人失望的是,
systemd
似乎无法根据大量的单位文件自行执行此操作。如系统文档所示,
enable
子命令的功能是运行单位文件的
[Install]
部分中的命令。通常这是为了设置一个单元在引导时自动运行。一旦一个装置被启用,它将在每次启动时启动,无需手动干预。马克,我不确定我是否清楚。在我看来,
systemd
应该完全能够通过单元文件中的一节来完成这项工作。鉴于它在引导时从已知位置加载这些单元文件,这样的选项对于目标系统来说是非常宝贵的,而不是依赖于其他方法。除了在目标文件系统中创建符号链接之外,似乎无法让
systemd
执行此操作,类似于
enable
所做的操作。我没有诋毁你的答案,只是评论说这似乎是一个缺点。顺便说一句,我实际上已经用符号链接创建方法解决了这个问题,但这有点困难。马克,做了一些更改以添加单独的开发/部署情况,希望你不介意[你不应该介意,因为我也接受了答案:-)]谢谢你的帮助。
ln -s ${SYSROOT}/lib/systemd/system/xyzzy.timer
      ${SYSROOT}/lib/systemd/system/multi-user.target.wants/xyzzy.timer