systemd는 서비스 A가 완료된 후에만 서비스 B를 시작합니다.

systemd는 서비스 A가 완료된 후에만 서비스 B를 시작합니다.

한두 시간 동안 검색했지만 올바른 해결책을 찾을 수 없는 것 같습니다. 상황은 이렇습니다.

여러 가지 서비스가 있습니다. Docker 컨테이너를 실행하는 서비스 A를 시작합니다. 애플리케이션이 시작된 다음 isActive파일 시스템의 마운트된 디렉터리에 파일을 씁니다.

서비스 및 경로 단위 파일 B가 있습니다. watch.path는 isActive존재할 때까지 기다리고 watch.service를 실행하며 서비스 파일은 " isActiveExists!"를 에코합니다.

논리의 이 부분은 잘 작동합니다. 서비스 A가 시작되는 것을 사용 sudo journalctl -xefb하고 지켜본 후 등록을 완료하고 파일에 씁니다. 그런 다음 서비스 B 단위 파일이 시작되고, 에코되고, 완료되는 것을 볼 수 있습니다.

그런 다음 서비스를 감시하는 서비스 B Require뿐만 아니라 여러 다른 서비스 파일(서비스 C/D/E/F)도 있습니다 . After단, 서비스 B가 시작/종료되기 전에 서비스 C/D/E/F가 시작됩니다.

이것은 나의 현재 "시계" 서비스입니다:

# watch_for_client.path
[Unit]
Wants=A.service
After=A.service

[Path]
PathExists=/A/B/C/d.txt

[Install]
WantedBy=multi-user.target

# watch_for_client.service
[Unit]
After=A.service

[Service]
Type=oneshot
ExecStart=/bin/echo "file found"

그런 다음 다른 파일에

[Unit]
Requires=wait_for_client.service
After=wait_for_client.service

[Service]
...
Type=simple
...

[Install]
WantedBy=multi-user.target

답변1

서비스 C/D/E/F의 서비스 단위 파일 구성에서 세 가지 사항을 변경해야 합니다.

  1. [Unit] 섹션에서: 이 줄을 삭제하세요.Requires=wait_for_client.service
  2. [Unit] 섹션: 이름이 잘못되었으며 서비스 B 이름과 일치 After=wait_for_client.service
    해야 합니다 .After=watch_for_client.service
  3. {Installation] 섹션에서: 다음과 같아야 합니다.WantedBy=watch_for_client.service

관련 정보