단일 시스템 서비스/프로그램을 여러 프로그램 및 서비스로 리팩터링하려고 합니다. 내 단일 대규모 서비스는 다음과 같습니다.
[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
따라서 여기에는 여러 가지 문제 지점이 있습니다(위의 설명에서 인용).
- 이 활동에는 더 이상 네트워크가 필요하지 않습니다. 여기에 무엇을 넣어야 하나요? 가능한 대상을 어떻게 찾아보나요?
- 시작 응용 프로그램이 시작 시 한 번만 실행되고 다시는 실행되지 않기를 원합니다.
Restart
플래그를 다른 것으로 바꿔야 할 것 같은데 , 뭐죠? - 물론 서비스 A가 완료된 후에 실행하고 싶습니다. 네트워크 이후가 아닌 0으로 종료하고 파일에 쓸 수 있는 경우에만 실행됩니다. 일회성 서비스 A가 성공적으로 시작된 후 어떻게 시작합니까?
- 3이 더 많을 것 같아요. 나는 아직도
WantedBy
목표와 목표 사이의 구분을 모호하게 만듭니다After
. 기본적으로WantedBy
그것이 속한 그룹, 그리고After
나중에 연재되어야 하는 그룹은 무엇입니까?
답변1
- 대상은 운영 체제에 따라 다르며 여기에 나열되지 않습니다. 아마도
default.target
. 출력을 보면 목표와 목적을 알 수 있습니다.systemctl list-dependencies
- "다시 시작"을 완전히 제거하십시오.
- 초기 서비스는 이어야 합니다
Type=oneshot
. 필요한 파일이 기록되었는지 여부에 따라 서비스가 올바르게 종료됩니다.ExecStartPre
대신 시작 초기화 스크립트를 사용할 수도 있습니다 . WantedBy
systemd
지정된 대상에 진입하면 서비스가 시작되도록 지시합니다 .After
해당 장치의 모든 장치가 완료된 후 지정된 대상(또는 장치)을 시작함을 나타냅니다.