매일 일정 기간 동안 OnCalendar를 사용하여 시스템 서비스 시작 및 중지

매일 일정 기간 동안 OnCalendar를 사용하여 시스템 서비스 시작 및 중지

매일 오전 9시에 시작하여 오후 23시에 실행을 끝내고 싶은 두 가지 서비스(비디오 플레이어와 이미지 인식 데몬)가 있습니다(시스템은 계속 실행되지만 부팅 시에도 마찬가지입니다). 각 서비스에 대해 -startup.service및 를 만들었습니다 -shutdown.service. 서비스는 a daemon-on.target와 a 로 결합되어 각각 및에 daemon-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는 일회성 명령으로 비디오 플레이어 서비스를 중지합니다.

[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는 일회성 명령으로 이미지 인식 서비스를 중지합니다.

[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=recog-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

답변1

좀 더 검색하고 시스템 매뉴얼 페이지를 읽은 후 작업을 조금 단순화하고 원하는 서비스 동작을 얻을 수 있었습니다.

첫째, 내 파일에 [Service] 섹션을 넣는 데 실수가 있었는데 .target, 이는 말이 되지 않습니다. 둘째, PartOf=비디오 플레이어와 인식 서비스를 구성 요소로 사용하여 최상위 수준 응용 프로그램을 만들 수 있는 명령문을 발견했습니다 . 마지막으로 Conflicts=옵션을 사용하면 서로 충돌하는 두 대상을 사용하여 애플리케이션을 시작/중지할 수 있습니다. 해당 대상에 연결된 s .timer는 서로 간에 플립플롭되어 내 애플리케이션 체인과 각각의 충돌을 비활성화하거나 활성화합니다 .targets. 결과는 여전히 7개의 파일에 포함되어 있는데, 이는 제가 유지 관리하려는 것보다 많지만 필요에 따라 작동합니다.

app.service는 최상위 애플리케이션이지만 더미이지만 다른 것을 실행할 수 있습니다.

[Unit]
Description=App Service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

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

app-mpv.service는 앱의 비디오 플레이어 구성 요소이므로 xorg에도 의존합니다.

[Unit]
Description=App Video Player Service
PartOf=app.service
After=app.service
Requires=xorg.target
After=xorg.target

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

[Install]
WantedBy=app.service

app-recog.service는 앱의 이미지 인식 구성요소이며 비디오 플레이어에 의존하지 않습니다.

[Unit]
Description=App Recognition Service
PartOf=app.service
After=app.service

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

[Install]
WantedBy=app.service

app-on.target은 가상 대상이며 app-on.timer가 트리거되는 즉시 활성화되고 차례로 app.service를 활성화합니다.

[Unit]
Description=App Startup Target
Conflicts=app-off.target
Wants=app.service
After=app.service
RefuseManualStart=yes

[Install]
Also=app-on.timer

app-off.target은 가상 대상이며 app-off.timer가 트리거되자마자 활성화되고 차례로 app.service를 비활성화합니다.

[Unit]
Description=App Shutdown Target
Conflicts=app.service app-on.target
RefuseManualStart=yes

[Install]
Also=app-off.timer

app-on.timer는 단순히 app-on.target을 트리거합니다.

[Unit]
Description=App Startup Schedule

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

[Install]
WantedBy=timers.target

app-off.timer는 단순히 app-off.target을 트리거합니다.

[Unit]
Description=App Shutdown Schedule

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

[Install]
WantedBy=timers.target

이 모든 혼란을 가능하게 하는 것은 (의 도움으로)이 기사):

systemctl --user enable app app-mpv app-recog
systemctl --user enable --now app-on.timer app-off.timer
systemctl --user start app

응용 프로그램이 실행되기 시작하고 타이머를 확인하면 둘 다 활성화되어 먼저 오는 것이 먼저 실행됩니다.

NEXT                         LEFT          LAST PASSED UNIT            ACTIVATES
Wed 2019-06-26 14:00:00 JST  1min 25s left n/a  n/a    app-off.timer app-off.target
Wed 2019-06-26 14:01:00 JST  2min 25s left n/a  n/a    app-on.timer  app-on.target

꺼짐 타이머가 트리거된 후 애플리케이션이 중지되지만 app-off.target온 타겟은 예약된 상태로 유지됩니다.

NEXT                         LEFT     LAST                         PASSED  UNIT            ACTIVATES
Wed 2019-06-26 14:01:00 JST  55s left n/a                          n/a     app-on.timer  app-on.target
n/a                          n/a      Wed 2019-06-26 14:00:04 JST  3ms ago app-off.timer app-off.target

켜짐 타이머가 트리거되면 애플리케이션이 시작되고 가 비활성화되지만 app-on.target꺼짐 타이머는 다시 활성화됩니다.

NEXT                         LEFT     LAST                         PASSED  UNIT            ACTIVATES
Thu 2019-06-27 14:00:00 JST  23h left Wed 2019-06-26 14:00:04 JST  57s ago app-off.timer app-off.target
n/a                          n/a      Wed 2019-06-26 14:01:01 JST  5ms ago app-on.timer  app-on.target

그리고 그 사이클은 계속됩니다. 이것이 구성하는 가장 좋은 방법인지 여전히 의심스럽고 다른 제안을 듣고 싶습니다!

관련 정보