포그라운드에서 systemd 서비스 동기화/실행

포그라운드에서 systemd 서비스 동기화/실행

내 Xsession을 내 사용자 정의 프로그램(설정과 같은 키오스크)으로 바꾸고 싶습니다. 이전에는 다음 과 같은 STARTUP파일에 변수를 설정했습니다 .xsessionrc.

STARTUP='/path/to/my/program'

이제 로깅, 구성 가능한 자동 재시작 등과 같은 일부 시스템 기능을 활용하기 위해 내 프로그램을 시스템 서비스로 래핑하고 싶습니다. 이전 설정과 마찬가지로 제3자 세션과 창 관리자를 실행하는 것을 피하고 싶었지만 세션을 활성 상태로 유지하려면 여전히 뭔가를 실행해야 했기 때문에 다음을 사용했습니다.

STARTUP='systemd-run --user --scope /path/to/my/program'

그러나 그것은 여전히 ​​편리한 시스템 장치가 아니며 결국 다음과 같이 되었습니다.

STARTUP='systemd-run --user --scope --unit my-session sleep inf'

내 프로그램이 실행될 서비스 단위를 정의했습니다.

[Unit]
Description=My service
BindsTo=my-session.scope
Requisite=my-session.scope
After=my-session.scope

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

[Install]
WantedBy=my-session.scope

일반적으로 이 설정은 매력적으로 작동하지만 동적으로 생성된 범위 이름에 의존하는 것은 나에게 투박해 보이고 때로는 세션을 다시 시작할 때 암시적인 정리가 필요합니다. 예를 들면 다음과 같습니다.

systemctl reset-failed my.service my-session.scope

systemd이미 불만이 존재하기 때문입니다 my-session.scope.

systemd-run --scope그래서 저는 시스템 서비스를 동기적으로 실행하는 동시에 동적으로 생성하는 대신 기존 단위 파일을 재사용하는 방법을 찾고 있습니다 .

추신: 다음을 시도했지만 작동하지 않습니다(systemctl을 중단해도 호스팅 서비스는 중단되지 않습니다).

systemctl start --wait my-session.target

답변1

마침내 몇 가지 적합한 구성을 찾았습니다.

a) 실행 중인 서비스를 다음으로 표시 하고 속성을 StopWhenUnneeded사용합니다 .Wantssystemd-run --scope

.xsessionrc:

STARTUP='systemd-run --user --scope --property Wants=my.service sleep inf'

내 서비스:

[Unit]
Description=My service
StopWhenUnneeded=yes

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

이는 실제로 최소한의 솔루션이며 필요한 모든 작업을 수행하지만 my.service수동으로 시작할 수는 없습니다. 필요한 경우:

b) 중간체를 도입 하고 다음 과 같이 my-session.target선언합니다 .my.servicePartOf=my-session.target

.xsessionrc:

STARTUP='systemd-run --user --scope --property Wants=my-session.target sleep inf'

내 서비스:

[Unit]
Description=My service
PartOf=my-session.target

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

[Install]
WantedBy=my-session.target

내 세션.대상:

[Unit]
Description=My session
StopWhenUnneeded=yes
RefuseManualStart=yes
RefuseManualStop=yes

c) 마지막으로 / systemd-run와 같은 "auto-only" 속성을 사용하는 것은 금지되지 않으므로 다음을 수행할 수 있다는 점에 유의할 가치가 있습니다 .BoundByConsistsOf

.xsessionrc

STARTUP='systemd-run --user --scope --property BoundBy=my.service --property Wants=my.service sleep inf'

내 서비스:

[Unit]
Description=My service

[Service]
Type=exec
ExecStart=/path/to/my/program
Restart=always

나는 이러한 속성을 해킹적이고 아마도 버그로 사용하는 것을 고려할 것입니다. 하지만 누군가는 그것이 유용하다고 생각할 수도 있습니다.

관련 정보