그래서 시스템 초기화를 분석하고 로그인 후 로드할 서비스 파일을 만들기 시작했습니다. 이것은 Polybar, Dunst 등과 같은 일반적인 것입니다. 모든 것이 작동하지만 pywal 설정에 몇 가지 문제가 있습니다. 종속성을 별도의 .target으로 분리했습니다.
테마.골
[Unit]
Description = Theme dependencies
BindsTo = xsession.target
Wants = pywal.service
Wants = i3.service
Wants = polybar.service
Wants = dunst.service
내가 달성하고 싶은 것은 pywal.service가 완전히 실행되고 시작 스크립트 실행을 마친 후에만 i3(및 나머지 목록)이 로드되도록 하는 것입니다.
.bin/pywal에서 10초 동안 잠을 잤습니다.
pywal.service
[Unit]
Description = Run pywal service responsible for color schemes
PartOf = theme.target
[Service]
ExecStart = %h/.bin/pywal
[Install]
WantedBy = theme.target
i3 서비스
[Unit]
Description = A tiling window manager
PartOf = theme.target
After = pywal.service
Requires = pywal.service
[Service]
ExecStart = /usr/bin/i3-msg restart
[Install]
WantedBy = theme.target
"성공적으로 실행"이 실제로 무엇을 의미하는지 혼란스러울 수 있지만 i3 서비스가 실행되자마자 다시 시작되는 것을 확인했습니다.
systemctl --user restart theme.target
그런 다음 3개의 서비스/대상 모두의 상태를 관찰하고 i3이 pywal.service와 동시에 다시 시작되는 것을 확인했습니다.
그럼 기본적으로 내가 여기서 놓치고 있는 것은 무엇이며 왜 i3가 pywal 이후 10초 후에 다시 시작되지 않습니까?
편집: 이 맥락에서 더 의미가 있도록 댓글을 기반으로 문장을 수정했습니다.
답변1
거기예"성공적으로 실행"에 대한 귀하의 이해는 systemd가 생각하는 것과 일치하지 않습니다. 그러한 서비스에 대해서는"유형"은 "단순"입니다., 의미는 다음과 같습니다.
simple로 설정된 경우(ExeStart=가 지정되었지만 Type=이나 BusName=이 지정되지 않은 경우 기본값) 서비스 관리자는 장치가 시작된 것으로 간주합니다.주요 서비스 프로세스가 분기된 직후입니다.
(내 강조)
여기서 미묘한 차이점은 타이밍입니다. systemd는 pywal 장치가 %h/.bin/pywal
시작되자마자 시작된다고 생각합니다.시작하다그리고 후속 장치가 "시작 스크립트 실행이 완료"될 때까지 기다리기를 원합니다.
따라서 종속성은 가능해지면 즉시 시작됩니다(시스템에 따르면), 이는 pywal이 시작된 직후 i3가 시작되고 pywal이 원하는 만큼 잠자기 상태가 될 수 있음을 의미합니다. 이는 i3의 부팅 시간에 더 이상 영향을 미치지 않습니다.
여기서 정답은 pywal Type=Notify를 제공하고 준비가 되면 systemd에 알리도록 하는 것입니다. systemd-notify에 대한 자세한 내용은 다음을 참조하세요.
해결책은 i3 장치를 수정하는 것일 수 있습니다.실행이 시작되기 전에:
# ...
[Service]
ExecStartPre = /bin/sleep 10
ExecStart = /usr/bin/i3-msg restart
# ...
...실제 i3 실행 파일이 실행되기 전에 10초 동안 기다리도록 강제합니다.