하나의 명령으로 여러 서비스를 시작하거나 중지할 때 systemctl은 서비스 종속성을 고려합니까?

하나의 명령으로 여러 서비스를 시작하거나 중지할 때 systemctl은 서비스 종속성을 고려합니까?

systemctl을 사용하면 시작 또는 중지 명령에 여러 서비스 이름을 전달할 수 있습니다.

systemd에서 서비스 A가 서비스 B보다 먼저 중지되도록 구성되었다고 가정합니다. 지금 실행하면

systemctl stop B A

그러면 A와 모든 종속 서비스가 먼저 중지되고 B 또는 B가 먼저 systemctl 명령에 전달됩니까? 내 말은 systemctl stop의 서비스 이름 순서가 서비스가 중지되는 순서를 정의하지 않는다는 것입니다.

나는 테스트를 실행했고 그들은 내 가설을 입증했습니다. 하지만 저는 이것이 항상 작동한다고 100% 확신하고 싶습니다.

답변1

설마! 현재 코드는 그다지 똑똑하지 않으며 단지 모든 서비스를 중지/시작하려고 시도합니다.

[주어진 순서대로 처리합니다. 이것은작은그래도 아주 똑똑해요. 어떤 이유로(아마도 성능상의 이유로) 각 항목 이후에 기다리지 않고 마지막에만 기다리게 됩니다. 그래서 그것은 그렇게 작동하지 않습니다 systemctl start A; systemctl start B. 더 가깝습니다 systemctl start A & systemctl start B & wait. ]

따라서 유닛 파일이 다음과 같다면 -

# A.service
[Unit]
After=B.service

[Service]
Type=oneshot
ExecStart=/bin/sleep 2

# B.service
[Service]
Type=oneshot
ExecStart=/bin/sleep 2

systemctl start A BA와 B가 시작됩니다. 현재 코드는아니요A를 시작하기 전에 B가 완전히 시작될 때까지 기다려야 합니다. [현재 A와 B는 병렬로 시작됩니다. ] 할 수 있습니다journalctl

Mar 20 20:50:29 alan-laptop systemd[2007]: Starting A.service...
Mar 20 20:50:29 alan-laptop systemd[2007]: Starting B.service...
Mar 20 20:50:31 alan-laptop systemd[2007]: Started A.service.
Mar 20 20:50:31 alan-laptop systemd[2007]: Started B.service. 

그러나 A와 B가 시작 시 초기 트랜잭션에 포함되면 예상대로 주문됩니다.

나는 여러 다른 장치 와 함께 사용할 systemd-run수 있는 임시 서비스를 생성하고 실행하기 위해 뭔가를 하는 것이 가능할 것이라고 생각했습니다 . 모든 종속성은 함께 처리됩니다. 그런 다음 장치 A에 순서 종속성이 있거나 장치 B에 대한 순서 종속성이 있는 경우 해당 순서 종속성이 존중됩니다.RequiresWantsConflictsBefore=After=

답변2

예, 귀하의 가정이 정확합니다.

단일 명령으로 여러 장치를 시작하거나 중지 하면 systemctl해당 명령은거래, 따라서 시스템 관리자 데몬(PID 1이라고도 함)은 둘 다 시작하려고 시도합니다.

순서 종속성이 존재하는 경우(다음을 사용하여 구성 Before=또는 After=지시문으로 구성) 이때 해당 종속성이 고려됩니다.

따라서 장치 B 다음에 장치 A를 시작하도록 순서를 구성하면(파일에 A.service표시됨 After=B.service) 이는 장치 A가 중지된다는 의미입니다.앞으로장치 B(장치를 중지할 때 순서가 반대임)를 사용하면 설명한 대로 실행됩니다. A에 의존하는 장치가 먼저 중지되고(A가 중지되면 계속 실행될 수 없기 때문에) A, 마지막으로 B가 중지됩니다. 아래에.

장치 간에 순차적 종속성이 없으면 장치가 시작되거나 중지됩니다.평행하게. (이것이 의미하는 바: systemd는 계속해서 순서대로 처리하지만 SIGTERM 신호로 프로세스를 종료하거나 프로세스를 포크하여 ExecStop=장치의 명령을 실행하지만잠깐만요마스터 PID를 종료하거나 ExecStop=명령을 완료하려면 다음과 같습니다."병렬"이런 맥락에서 의미가 있습니다. 신호는 비동기적이고 포크는 비차단이므로 이는 진정한 병렬성에 매우 가깝고 거의 모든 효과가 동일하다고 간주될 수 있습니다. )

대부분의 경우 전달된 단위의 순서는 systemctl중요하지 않습니다. (매우 극단적인 경우에만 동일하게 작동합니다.) 명시적인 순서 종속성이 있으면 존중됩니다. 그렇지 않으면 서비스가 병렬로 시작/중지됩니다.

간단히 말해서 systemctl stop B A본질적으로 systemctl stop A B같은 것입니다.

관련 정보