시스템 장치에 종속되는 시스템 사용자 단위(sleep.target)

시스템 장치에 종속되는 시스템 사용자 단위(sleep.target)

문서를 읽고 있지만 다음 작업을 수행할 수 있는지 여전히 확실하지 않습니다.

거기에 정의된 서비스는 ~/.config/systemd/user/task.service시스템에 따라 다릅니다 sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

task.service이제 런타임에 시작하고 $ systemctl suspend싶지만 그렇지 task.service않습니다.

저는 데비안을 실행하고 있고 시스템 버전은 208이며 systemd --user구성은 대략 다음과 같습니다.건축 위키피디아.

내 시나리오가 systemd로 구현될 수 있는지, 아니면 유닛이 유닛의 종속성이 되지 않도록 설계상 완전히 --system격리될 수 있는지 궁금합니다 .--user--user--system

가능하다면 내 경우에는 무엇이 문제가 될 수 있습니까?

답변1

~에서시스템/사용자 - Archwiki

systemd --user별도의 프로세스로 systemd --system실행됩니다 . 사용자 단위는 시스템 단위를 참조하거나 의존할 수 없습니다.

하나 있다시스템 GitHub 저장소의 기능 요청이 문제를 추적하세요.

답변2

서비스와 사용자 인스턴스 간의 모든 절전/일시 중지 대상에 대한 "프록시"를 만들 수도 있습니다.

이 파일을 다음 위치에 생성하세요:/etc/systemd/system/[email protected]

[Unit]
Description=Call user's suspend target after system suspend
After=suspend.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --user --machine=%i@ start --wait suspend.target

[Install]
WantedBy=suspend.target

을 실행하여 활성화합니다 sudo systemctl daemon-reload && sudo systemctl enable suspend@youruser.

이제 suspend.target사용자 를 생성하십시오 ~/.config/systemd/user/suspend.target.

[Unit]
Description=User level suspend target
StopWhenUnneeded=yes
Wants=my-etc-service.service

그런 다음 서비스를 Wants목록에 추가하고 실행 중인지 확인하세요.systemctl --user daemon-reload

답변3

systemd사용자 세션 서비스는 완전히 별도의 인스턴스에서 실행되며 systemd어떤 방식으로든 시스템 서비스에 직접적으로 종속되지 않습니다.

그러나 원하는 것을 달성하는 다른 방법이 있습니다. 가장 깔끔한 방법은 아마도 logind시스템이 절전 모드에 들어갈 때 억제제 에 실행하려는 모든 것을 연결한 다음 이를 배경 데몬으로 실행하는 것입니다.

logind보다 일반적인 해결책은 억제제 에 데몬 후크를 두는 것입니다 (참조:시스템 잠금 핸들러그리고xss 잠금,) 그런 다음 시스템이 절전 모드로 전환되면 서비스를 주문할 수 있는 사용자 세션 대상을 활성화합니다.

답변4

사용자 공간에서 구현 sleep.target(및 보완 )하려면 다음을 수행할 수 있습니다 awake.target.

다음 서비스 템플릿을 생성합니다./etc/systemd/system/[email protected]

[Unit]
Description=%I sleep hook
PartOf=sleep.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemctl --user --machine=%i@ start sleep.target
ExecStop=/usr/bin/systemctl --user --machine=%i@ start awake.target

[Install]
WantedBy=sleep.target

사용자를 위해 인스턴스를 생성합니다(시작하지 마세요):

sudo systemctl enable sleep@$(whoami)

이제 사용자에게는 다음과 같습니다 sleep.target.

[Unit]
Description=User-level Sleep Target
Conflicts=awake.target

그리고 awake.target:

[Unit]
Description=User-level Awake Target
Conflicts=sleep.target

[Install]
WantedBy=default.target

systemctl --user enable awake.target로그인 시 시작 가능

목표 중 하나에 도달하면 다른 목표는 중지됩니다.Conflicts지시문으로 인해 상호 배타적인 대상이 됩니다.

내 사용 사례에서는 실제로 다음을 사용하여 일부 사용자 서비스를 가질 수 있기 때문에 awake.target더 유용하다는 것을 알았습니다.sleep.targetPartOf시작하고 중지하라는 지침입니다.

제가 생각하기에 타겟팅을 통해 이익을 얻을 수 있는 유일한 사용 사례 는 시스템이 절전 모드로 전환되기 전에 sleep누군가 마지막 순간에 정리 작업을 수행하려고 하는 경우입니다 . systemd-inhibit이는 또한 실제 수면 목표를 업무가 끝날 때까지 미루는 것을 의미합니다.

관련 정보