내 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
사용합니다 .Wants
systemd-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.service
PartOf=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" 속성을 사용하는 것은 금지되지 않으므로 다음을 수행할 수 있다는 점에 유의할 가치가 있습니다 .BoundBy
ConsistsOf
.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
나는 이러한 속성을 해킹적이고 아마도 버그로 사용하는 것을 고려할 것입니다. 하지만 누군가는 그것이 유용하다고 생각할 수도 있습니다.