하나의 시스템 서비스는 다른 서비스에 종속됩니다.

하나의 시스템 서비스는 다른 서비스에 종속됩니다.

단일 시스템 서비스/프로그램을 여러 프로그램 및 서비스로 리팩터링하려고 합니다. 내 단일 대규모 서비스는 다음과 같습니다.

[Unit]
Description=Runs the App loop
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/mainLoop
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target

나는 이것을 다른 예에서 종합했습니다. 내가 지금 원하는 것은 두 가지 서비스입니다.

서비스 A

[Unit]
Description=Initializes some things
After=network-online.target # Question 1

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/startup
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure # Question 2

[Install]
WantedBy=multi-user.target

서비스 B

[Unit]
Description=Runs the App loop
After=network-online.target # Question 3

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /App/mainLoop
WorkingDirectory=/App
StandardOutput=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target # Question 4

따라서 여기에는 여러 가지 문제 지점이 있습니다(위의 설명에서 인용).

  1. 이 활동에는 더 이상 네트워크가 필요하지 않습니다. 여기에 무엇을 넣어야 하나요? 가능한 대상을 어떻게 찾아보나요?
  2. 시작 응용 프로그램이 시작 시 한 번만 실행되고 다시는 실행되지 않기를 원합니다. Restart플래그를 다른 것으로 바꿔야 할 것 같은데 , 뭐죠?
  3. 물론 서비스 A가 완료된 후에 실행하고 싶습니다. 네트워크 이후가 아닌 0으로 종료하고 파일에 쓸 수 있는 경우에만 실행됩니다. 일회성 서비스 A가 성공적으로 시작된 후 어떻게 시작합니까?
  4. 3이 더 많을 것 같아요. 나는 아직도 WantedBy목표와 목표 사이의 구분을 모호하게 만듭니다 After. 기본적으로 WantedBy그것이 속한 그룹, 그리고 After나중에 연재되어야 하는 그룹은 무엇입니까?

답변1

  1. 대상은 운영 체제에 따라 다르며 여기에 나열되지 않습니다. 아마도 default.target. 출력을 보면 목표와 목적을 알 수 있습니다.systemctl list-dependencies
  2. "다시 시작"을 완전히 제거하십시오.
  3. 초기 서비스는 이어야 합니다 Type=oneshot. 필요한 파일이 기록되었는지 여부에 따라 서비스가 올바르게 종료됩니다. ExecStartPre대신 시작 초기화 스크립트를 사용할 수도 있습니다 .
  4. WantedBysystemd지정된 대상에 진입하면 서비스가 시작되도록 지시합니다 . After해당 장치의 모든 장치가 완료된 후 지정된 대상(또는 장치)을 시작함을 나타냅니다.

관련 정보