을(를) 사용할 계획입니다 . 각 고객 인스턴스를 사용 하고 전체 고객 인스턴스 모음을 함께 중지하고 시작할 수 있는 단일 서비스로 처리할 systemd
수 있기를 원합니다 .stop
start
systemd
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]
enable
disable
# 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
모든 애플리케이션을 함께 사용하여 중지할 수 있습니다.start
app@customer
start app
stop app
답변2
줄을 옮겨야 합니다.
PartOf=app.service
[Service]
이 섹션 에 들어가고 나가서 [Unit]
실행할 클라이언트 목록에 추가하세요 [Unit]
.app.service
[email protected] [email protected]
또는 Sourcejedi가 댓글에서 말했듯 Requires=
이 마찬가지입니다. PartOf
위 목록에 없는 서비스를 수동으로 시작하고 중지한 상태로 유지할 수 있습니다 .systemctl --user start [email protected]