After= 시스템 장치에 대한 지시어가 예상대로 작동하지 않음

After= 시스템 장치에 대한 지시어가 예상대로 작동하지 않음

그래서 시스템 초기화를 분석하고 로그인 후 로드할 서비스 파일을 만들기 시작했습니다. 이것은 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초 동안 기다리도록 강제합니다.

관련 정보