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


12

를 사용하는 고객을 위해 동일한 웹 앱의 여러 인스턴스를 호스팅 할 계획 systemd입니다. 고객 인스턴스 의 전체 컬렉션을 중지하고 함께 시작할 수있는 단일 서비스로 취급 할뿐 아니라 각 고객 인스턴스를 사용하여 각 고객 인스턴스를 사용 stop하고 싶습니다 .startsystemd

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

app@.service고객 인스턴스를 작성하는 데 사용되는 단위 템플릿 파일

[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

개념 증명을 위해 시스템 단위 파일이에 ~/.config/systemd/user있습니다.

그런 다음 템플릿을 기반으로 부모 및 인스턴스를 시작합니다 ( systemctl --user daemon-reload).

systemctl --user start app
systemctl --user start app@customer.service

사용하여 journalctl -f시작한 것과 고객 인스턴스가 계속 실행되고 있음을 알 수 있습니다. 이제 II는 부모를 종료하면 아이를 멈출 것으로 예상 PartOf하지만 ( 사용했기 때문에 ) 그렇지 않습니다. 또한 부모를 시작해도 자식이 예상대로 시작되지 않습니다.

systemctl --user stop app

감사!

(시스템 229와 함께 Ubuntu 16.04를 사용하고 있습니다).


1
"PartOf = Required =와 비슷한 종속성을 구성하지만 장치 중지 및 재시작으로 제한됩니다." 일을 시작하고 싶다면 Requires=대신 사용할 필요가 없습니까?
sourcejedi

답변:


10

선을 움직여야합니다

PartOf=app.service

에서 [Service]와에 [Unit]로 섹션 및 추가 [Unit]app.service고객의 목록을 시작하려면, 예를 들어,

Wants=app@customer1.service app@customer2.service

또는 sourcejedi가 의견에서 말했듯 Requires=이 동일한 내용입니다. PartOf위 목록에없는 것과 같이 시작한 서비스를 (으)로 중지 할 수 있습니다 systemctl --user start app@customer3.service.


당신이 옳다는 것을 확인했습니다 PartOf. 감사. 심볼릭 링크를 통해 "원함"을 처리하려고합니다. 이는 시스템으로 새로운 고객을 활성화하기 위해 취해야 할 단일 조치가됩니다. 테스트 사례 :`ln -s /home/mark/.config/systemd/user/app@.service / home / mark / .config / systemd / user / app.service.wants / unity @ foo.service`
마크 스 토스 버그

14

나는 이것이 시스템화 된 "타겟 유닛 (Target Units)"이 무엇인지 배웠다. 대상 장치를 사용하면 [Service]위 의 가짜 섹션 을 만들지 않고도 원하는 이점을 얻을 수 있습니다 . "Target Unit"파일의 실제 예는 다음과 같습니다.

# 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[Unit](@meuh에 의해 지적 아웃으로) 섹션, 그리고 또한이 있어야 [Install]있도록 섹션을 enable하고 disable특정 서비스에서 작동합니다 :

# In a file name like app@.service
[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

지금이 시점에서 내가 사용할 수 있습니다 stopstartapp@customer에 특정 인스턴스, 아니면 사용할 수 start appstop app함께 모든 응용 프로그램을 중지 할 수 있습니다.


상태는 어떻습니까? 앱이 원하는 모든 서비스의 상태를 얻는 간단한 방법을 찾을 수 없습니다. 내가 어떻게 스크립트를 작성할 수 있는지는 알고 있지만 ...
Tommi Kyntola

1
나는 그 대상 그룹에서 앱의 상태를 얻는 것, 그 일부, 와일드 카드 등을 나열하지 않고, 바람직하게는 그룹 이름을 사용하고 만든 것을 신경 쓰지 않는 것 등을 의미합니다.
Tommi Kyntola

2
그렇게 간단하지 않습니다. 해당 스크립트는 어느 패킷에 속합니까? 새 구성 요소가 추가 될 때마다 수정해야합니다. 잊어 버리고 배포 / 유지 보수는 끝이 없습니다. 내가 분명히 원하는 것은 partOf 설정으로 새 패킷을 추가하여 해당 그룹에 존재한다는 것을 표시하고 남아있는 스크립트를 수정 하지 않는 것입니다. 그런 다음 해당 대상을 중지하고 시작하면 이전과 동일하게 작동합니다. 이것은 작동하지만 상태는 해당 범위를 벗어난 것으로 보입니다. 대상에 런타임으로 존재하는 유닛 목록을 얻는 방법조차 찾을 수 없습니다. 이 사용 사례는 systemd에서 다루지 않습니다.
Tommi Kyntola

2
@TommiKyntola 다음은 대상 종속성이 변경 될 때 업데이트 할 필요가없는 bash one-liner입니다.systemctl status $(systemctl list-dependencies --plain otp.target)
Mark Stosberg

2
@TommiKyntola systemd여기에서 유용성을 향상시킬 수 있다는 데 동의합니다 . 나는 한 기능 요청 개방 대상에 대해 개선 된 상태를 제안 할 수있다.
Mark Stosberg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.