여러 인스턴스를 함께 중지/시작하기 위해 가상 시스템 서비스를 만드는 방법은 무엇입니까?

여러 인스턴스를 함께 중지/시작하기 위해 가상 시스템 서비스를 만드는 방법은 무엇입니까?

을(를) 사용할 계획입니다 . 각 고객 인스턴스를 사용 하고 전체 고객 인스턴스 모음을 함께 중지하고 시작할 수 있는 단일 서비스로 처리할 systemd수 있기를 원합니다 .stopstartsystemd

systemd제가 사용해야 할 빌딩 블록과 템플릿 단위 파일이 제공되는 것 같은데 PartOf, 상위 서비스를 중지해도 하위 클라이언트 서비스는 중지되지 않습니다. systemd로 이 작업을 어떻게 수행할 수 있나요? 이것이 내가 지금까지 가지고 있는 것입니다.

상위 단위 파일 app.service:

[Unit]
Description=App Web Service

[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal

[email protected]고객 인스턴스를 생성하는 데 사용되는 단위 템플릿 파일 :

[Unit]
Description=%I Instance of App Web Service

[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal

app-poc.sh스크립트(로그 파일을 반복하는 개념 증명):

#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
  echo "The App PoC loop for $@"
  sleep 2;
done

개념을 설명하기 위해 systemd 단위 파일을 ~/.config/systemd/user.

그런 다음 상위 및 템플릿 기반 인스턴스를 시작합니다(나중에 systemctl --user daemon-reload).

systemctl --user start app
systemctl --user start [email protected]

사용하면 journalctl -f둘 다 시작되고 클라이언트 인스턴스가 계속 실행되는 것을 볼 수 있습니다. 이제 부모를 닫으면 자식이 차단될 것으로 예상됩니다.PartOf) 그러나 이는 사실이 아니다. 또한 부모 프로세스를 시작해도 자식 프로세스가 예상대로 시작되지 않습니다.

systemctl --user stop app

감사해요!

(저는 Ubuntu 16.04 및 systemd 229를 사용하고 있습니다).

답변1

나는 이것이 시스템의 "대상 유닛"의 목적이라는 것을 배웠습니다. 표적 세포를 사용하면 [Service]위의 가짜 부분을 만들지 않고도 원하는 이점을 얻을 수 있습니다 . 실제 예제 "대상 장치" 파일은 다음과 같습니다.

# named like app.target
[Unit]
Description=App Web Service

# This collection of apps should be started at boot time.
[Install]
WantedBy=multi-user.target

PartOf그런 다음 각 클라이언트 인스턴스는 해당 섹션에 포함되어야 하며 (@meuh가 지적한 대로) 특정 서비스를 처리할 수 있는 섹션 [Unit]도 있어야 합니다 .[Install]enabledisable

# In a file name like [email protected]
[Unit]
Description=%I Instance of App Web Service
PartOf=app.target

[Service]
ExecStart=/home/mark/bin/app-poc.sh %i
Restart=on-failure
StandardOutput=journal

# When the service runs globally, make it run as a particular user for added security
#User=myapp
#Group=myapp

# When systemctl enable is used, make this start when the App service starts
[Install]
WantedBy=app.target

고객 인스턴스를 시작하고 대상이 시작될 때 시작되도록 하려면 다음 일회성 활성화 명령을 사용하십시오.

 systemctl enable app

이제 특정 인스턴스에 및를 사용하거나 stop모든 애플리케이션을 함께 사용하여 중지할 수 있습니다.startapp@customerstart appstop app

답변2

줄을 옮겨야 합니다.

PartOf=app.service

[Service]이 섹션 에 들어가고 나가서 [Unit]실행할 클라이언트 목록에 추가하세요 [Unit].app.service

[email protected] [email protected]

또는 Sourcejedi가 댓글에서 말했듯 Requires=이 마찬가지입니다. PartOf위 목록에 없는 서비스를 수동으로 시작하고 중지한 상태로 유지할 수 있습니다 .systemctl --user start [email protected]

관련 정보