如何使用 systemd 替换每五分钟 运行 的 cron 作业?
How do I use systemd to replace cron jobs meant to run every five minutes?
我们有一个嵌入式目标环境(与主机构建环境分开),其中 systemd
是 运行ning 而不是 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
会确保计时器单元已安装并 运行ning,因此会定期启动服务。但是,我注意到 multi-user.target.wants
目录实际上没有计时器的符号 link。
systemd
是如何做到的?
计时器在您实际启用之前不会激活:
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
目录旨在托管由软件包或 OS.
安装的 systemd
文件
如果您的 cron 作业 运行 精确地 每 5 分钟一次很重要,您应该检查准确性,因为 systemd's monotonic timers can slip over time
我们有一个嵌入式目标环境(与主机构建环境分开),其中 systemd
是 运行ning 而不是 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
会确保计时器单元已安装并 运行ning,因此会定期启动服务。但是,我注意到 multi-user.target.wants
目录实际上没有计时器的符号 link。
systemd
是如何做到的?
计时器在您实际启用之前不会激活:
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
目录旨在托管由软件包或 OS.
systemd
文件
如果您的 cron 作业 运行 精确地 每 5 分钟一次很重要,您应该检查准确性,因为 systemd's monotonic timers can slip over time