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