我正在寻找一个每 1 小时 18 分钟运行一次的 systemd 计时器,但我只有这个线索。
systemd-analyze --iterations=3 calendar *:0/18
每 18 分钟一班。
我正在寻找一个每 1 小时 18 分钟运行一次的 systemd 计时器,但我只有这个线索。
systemd-analyze --iterations=3 calendar *:0/18
每 18 分钟一班。
“启动时”对我来说含糊不清。这是否意味着启动开始时、启动完成时、启动中期、满足timer.target 时?我读过的文档并没有解决这种歧义。
每次重新启动时都会运行一个被禁用(“静态”)并且只应该由计时器触发的 systemd 服务单元。
这是一个服务单元 (in /etc/systemd/system/
),之前有一个[Install]
部分并且是systemctl enable
d。
该[Install]
部分已删除,服务已禁用。该服务现在由计时器触发。计时器设置为每月运行一次并且是持久的,因此它会跟踪上次运行并且不会在重新启动时触发,除非在关机时错过了运行。
systemctl --system daemon-reload
我在做出改变后跑了。
计时器工作正常,并按预期触发服务。
重新启动时,服务单元始终运行,而不管计时器的最后一次运行以及计时器是持久的事实。我已经(通过systemctl list-timers
)验证了触发服务单元的不是定时器单元(除非list-timers
关于上次触发时间的输出是错误的)。
systemctl is-enabled <service-unit>
显示static
(又名禁用,[Install]
单元中没有部分)。
find /etc/systemd/system/*.wants -name <service-unit>
不显示之前安装/启用此服务时剩余的任何已安装符号链接。
我怀疑以前安装此服务单元时存在“遗留”的东西,导致该服务在重新启动时启动,但不知道在哪里查找。
这是在 ubuntu 20.04 上(以防发生已知的错误/问题)。
有没有办法调试 systemd 为什么启动一个单元?(例如,单元 X 开始是因为想要文件 Z 中的 Y)。
有没有办法仔细检查这个服务真的不是由计时器启动的(而不是仅仅通过list-timers
输出)?
# cat /etc/systemd/system/mysql_tzinfo.service
[Unit]
Description=mysql_tzinfo
Wants=mysql_tzinfo.timer
[Service]
Type=oneshot
Environment=
WorkingDirectory=/tmp
ExecStart=/bin/sh -c "/usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | /usr/bin/mysql --user=root mysql"
User=root
Group=root
# cat /etc/systemd/system/mysql_tzinfo.timer
[Unit]
Description=Timer for mysql_tzinfo.service
Requires=mysql_tzinfo.service
[Timer]
Unit=mysql_tzinfo.service
OnCalendar=*-*-05 04:00:00
AccuracySec=30s
Persistent=true
[Install]
WantedBy=timers.target
我想通过 systemd.timer 单元每 5 分钟启动一个命令(一致)作为 systemd.service。单独的“.service”文件运行良好。但是,当它由计时器单元启动时,它会运行多次并停止并出现以下错误:Start request repeated too quickly.
和Failed with result 'start-limit-hit'
. 但为什么?
我像这样启动计时器服务:systemctl --user start service.timer
.
这些文件位于:$HOME/.config/systemd/user/
.
同步服务
[Unit]
Description=Sync Service
[Service]
Type=oneshot
ExecStart=/bin/zsh -l -c "unison -batch %u"
ExecStartPost=/bin/zsh -l -c 'dunstify "sync ~"'
[Install]
WantedBy=graphical.target
同步定时器
[Unit]
Description=Timer for Sync Service
[Timer]
OnCalendar=*-*-* *:0/5:*
AccuracySec=5s
[Install]
WantedBy=timers.target
unison 命令通过 ssh 使用受密码保护的密钥文件通过网络同步到服务器。用户正在运行一个ssh-agent
实例。这就是为什么我必须使用登录外壳:zsh -l -c "..."
.
我编写了一个非常简单的脚本 ( checkaudio.sh
),它从 mqtt 主题的文件中发布消息。我希望脚本连续运行(即使每一秒我都会很高兴)。我首先尝试使用 cron,这在技术上是可行的,但作为一种解决方案是“肮脏的”(多个 cron 作业,每个作业延迟 1 秒)。
我已经尝试过systemd
及其timer
功能。我对systemd不是很精通,这就是我想出的:
/etc/systemd/system/[email protected]
内容:
[Unit]
Description=Announce every second
[Install]
WantedBy=default.target
[Service]
Type=oneshot
ExecStart=/root/checkaudio.sh
/etc/systemd/system/[email protected]
内容:
[Timer]
OnUnitActiveSec=1s
AccuracySec=1ms
[email protected]
我通过 激活了上面的两个systemctl enable
。一切都运行顺利,直到我重新启动系统并且我无法再启用/etc/systemd/system/[email protected]
。我收到以下错误:
The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
1) A unit may be statically enabled by being symlinked from another unit's
.wants/ or .requires/ directory.
2) A unit's purpose may be to act as a helper for some other unit which has
a requirement dependency on it.
3) A unit may be started when needed via activation (socket, path, timer,
D-Bus, udev, scripted systemctl call, ...).
4) In case of template units, the unit is meant to be enabled with some
instance name specified.
我究竟做错了什么?有没有更好的方法来实现我连续运行脚本的初始目标?
我需要在 09:15 - 17:15 之间每分钟启动一项服务。
实现这一目标的最佳方法是什么?
我可以制作 3 个计时器,一个用于启动 (1) 计时器 (2),它每分钟运行一次服务,一个用于停止它 (3)。但是对于两者之间的重新启动来说,它不会很健壮。
我想设置一个计时器,它将停止服务,执行脚本并重新启动服务。
一种可能性是使用
Type=oneshot
ExecStartPre=/bin/systemctl stop myservice
ExecStart=/usr/local/bin/myscript.sh
ExecStartPost=/bin/systemctl start myservice
另一个是myscript.sh
处理整个事情,包括systemctl
.
不过,我发现在服务声明中使用它很尴尬,因为systemctl
可能有 systemd 内置机制与服务交互。有没有更简洁的方法来执行这些操作?
我有 systemd 单元文件,我知道它可以通过提供参数在失败时重新启动,例如:
Restart=always
RestartSec=90
每次失败都会在90秒后重新启动,
但是,我只想在系统时间在给定时间范围之间时重新启动,比如在 08:00 和 17:00 之间,然后才重新启动。
有没有办法通过 systemd 做到这一点?
我使用systemd-cron
which 在 /lib/systemd 下创建单元文件。单位文件cron-daily.timer
有
[Timer]
OnCalendar=daily
这会在午夜触发脚本。我希望他们改为在凌晨 3 点触发。
如果我override.conf
在cron-daily.timer.d
目录下创建/etc/systemd/system
有
[Timer]
OnCalendar=*-*-* 03:00:00
并运行 daemon-reload,重新启动计时器并运行systemctl list-timers
它仍然希望在 00:00:00 运行。但是,如果我改变我override.conf
的
[Timer]
OnCalendar=hourly
然后它想按预期每小时运行一次。为什么我不能覆盖服务以在特定时间运行?
我很难弄清楚在 :50 分钟标记处每小时运行一次的格式。
我试过了:
OnCalendar=00/0:50
但它
定时器单元缺少值设置。拒绝。