每天一段时间都使用OnCalendar启动和停止系统服务

时间:2019-06-26 03:19:28

标签: linux timer scheduled-tasks daemon systemd

我有两个服务(一个视频播放器和一个图像识别守护程序),我想在上午9点开始运行,并在每天23pm结束运行(以及在启动时运行,尽管系统将连续运行)。对于每个服务,我创建了一个-startup.service和一个-shutdown.service。这些服务合并在daemon-on.targetdaemon-off.target中,然后分别由daemon-on.timerdaemon-off.timer触发。

经过几次尝试和测试,我发现计时器最初会按预期触发目标,但进入NEXT时间设置为n / a的状态。

要使两个应用程序运行带有计时器,这是一项艰巨的工作。我确定它缺少明显的东西,并且会感谢您的提示!

mpv-startup.service启动视频播放器服务:

[Unit]
Description=MPV Video Player Startup
After=xorg.target
Requires=xorg.target

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/python3 /opt/videoplayer/app.py
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10

[Install]
Also=daemon-on.timer

recog-startup.service启动图像识别服务:

[Unit]
Description=Recog Startup Service

[Service]
Type=simple
WorkingDirectory=/opt/recog
ExecStart=/opt/recog/recog run
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=30

[Install]
Also=daemon-on.timer

mpv-shutdown.service将视频播放器服务作为oneshot命令停止

[Unit]
Description=MPV Video Player Shutdown

[Service]
Type=oneshot
ExecStart=/bin/systemctl --user stop mpv-startup.service

[Install]
Also=daemon-off.timer

recog-shutdown.service作为oneshot命令停止图像识别服务:

[Unit]
Description=Recog Shutdown Service

[Service]
Type=oneshot
ExecStart=/bin/systemctl --user stop recog-startup.service

[Install]
Also=daemon-off.timer

daemon-on.target结合了上面的两个启动服务,并且在启动时也启用了default.target:

[Unit]
Description=Daemon Startup Target
Wants=recog-startup.service mpv-startup.service
After=recog-startup.service mpv-startup.service

[Service]
Type=oneshot

[Install]
WantedBy=default.target
Also=daemon-on.timer

daemon-off.target结合了以上两个关闭服务:

[Unit]
Description=Daemon Shutdown Target
Wants=recog-shutdown.service mpv-shutdown.service
After=recog-shutdown.service mpv-shutdown.service

[Service]
Type=oneshot

[Install]
Also=daemon-off.timer

daemon-on.timer设置为在上午9点触发以触发daemon-on.target:

[Unit]
Description=Daemon Startup Schedule

[Timer]
OnCalendar=9:00
Unit=nottrecog-on.target
Persistent=true

[Install]
WantedBy=timers.target

daemon-off.timer设置为在晚上23点触发daemon-off.target:

[Unit]
Description=Daemon Shutdown Schedule

[Timer]
OnCalendar=23:00
Unit=daemon-off.target
Persistent=true

[Install]
WantedBy=timers.target

将所有这些内容放置在~/.config/systemd/user/下之后,我可以通过以下方式启用它们:

systemctl --user enable --now daemon-on.target
systemctl --user enable --now daemon-on.timer
systemctl --user enable --now daemon-off.timer

这将在每次引导时自动启动守护程序,在这里我希望计时器根据OnCalendar=选项启动/停止守护程序。此时systemctl --user list-timers告诉我,我的两个计时器将在正确的时间触发(请注意,我将计时器设置为仅间隔3分钟以节省等待时间):

NEXT                         LEFT         LAST                         PASSED    UNIT            ACTIVATES
Wed 2019-06-26 12:12:00 JST  1min 4s left Wed 2019-06-26 11:35:02 JST  35min ago daemon-off.timer daemon-off.target
Wed 2019-06-26 12:15:00 JST  4min 4s left Wed 2019-06-26 11:40:48 JST  30min ago daemon-on.timer  daemon-on.target

然后触发关闭计时器,我的守护程序停止,几分钟后,打开计时器被触发,并且守护程序按预期方式启动。但是,再次查看计时器,我发现它们已被重置并且NEXT / LEFT字段被设置为n / a,并且永远不会再次触发守护程序。这是什么问题?

NEXT LEFT LAST                         PASSED       UNIT            ACTIVATES
n/a  n/a  Wed 2019-06-26 12:12:06 JST  4min 18s ago daemon-off.timer daemon-off.target
n/a  n/a  Wed 2019-06-26 12:15:33 JST  50s ago      daemon-on.timer  daemon-on.target

0 个答案:

没有答案