예를 들어, 일반적으로 서로 충돌하는 일부 서비스(동일한 포트 등)가 있습니다. 하지만 동시에 실행할 필요는 없습니다. 예를 들어 서비스를 시작하면 해당 서비스가 실행 중인지 a
확인 하고 중지합니까? 다른 서비스가 실행되고 있지 않으면 정상적으로 시작됩니다. 하지만 그렇다면 다른 서비스에 명령을 보냅니다.b
c
b
stop
systemctl stop a.service
현재로서는 해결 방법으로 while 루프를 실행하고 systemctl status a.service
중지가 반환될 때까지 grep을 실행한 다음 systemctl stop c.service
while 루프를 실행하고 systemctl status c.service
중지가 반환될 때까지 grep하는 .sh가 있습니다 . 둘 다 중지한 후 실행한 후 돌아옵니다 systemctl start b.service
. 그런 다음 시작 a.service
및 에 대한 동일한 파일을 만들었지 c.service
만 제 생각에는 이 해결 방법이 다소 혼란스럽고 공식적인 것이 있는지 궁금합니다.
답변1
~에서systemd.unit(5)
:
갈등 =
공백으로 구분된 단위 이름 목록입니다. 부정적인 요구 사항 종속성을 구성합니다. 한 유닛이 다른 유닛에 충돌=을 설정한 경우 전자를 시작하면 후자는 중지되고 그 반대의 경우도 마찬가지입니다.
이 설정은 위에서 설명한 Wants= 및 Requires= 종속성과 유사한 순서 종속성을 의미하지 않습니다. 즉, 다른 장치가 시작되기 전에 충돌하는 장치가 중지되도록 하려면 After= 또는 Before= 종속성을 선언해야 합니다. 작업 중지는 항상 작업 시작 전에 정렬되므로 두 가지 정렬 종속성 중 어느 것이 사용되는지는 중요하지 않습니다. 아래 Before=/After=의 설명을 참조하세요.
장치 B와 충돌하는 장치 A가 장치 B와 동시에 시작되도록 예약된 경우 트랜잭션은 실패하거나(둘 다 트랜잭션의 필수 부분인 경우) 이를 수정하기 위해 수정됩니다(하나 또는 두 작업이 모두 손상된 경우). 거래의 필수 부분은 아닙니다)). 후자의 경우 불필요한 작업이 제거되거나 둘 다 필요하지 않은 경우 충돌하는 장치가 시작되고 충돌하는 장치가 중지됩니다.
따라서 죽이고 싶을 때 B
시작할 C
때마다 A
추가하면 됩니다 [Unit]
.A.service
[Unit]
Conflicts=B.service C.service
Conflict=
세 유닛을 모두 결합 하면 어떤 유닛을 실행할지 선택하게 됩니다. 따라서 A를 시작하면 B&C가 종료되고, B를 시작하면 A&C가 종료되며, C를 시작하면 A&B가 종료됩니다.
기본적으로 실행 하려는 것처럼 들리 B.service
므로 하나만 WantedBy=multi-user.target
중요해야 합니다. 다른 항목에 추가하지 마십시오(또는 활성화하지 마십시오). 그렇지 않으면 부팅 시 모두 시작을 시도하고 실패하거나 임의의 항목이 계속 실행됩니다.
B.service
멈추 A.service
거나 하면 당신도 시작하고 싶은 것 같습니다 C.service
. 당신이 원하지 않는 것보다 당신이 원하는 것에 대해 더 많이 생각하려고 노력하십시오. Systemd에는 다른 장치가 종료될 때 한 장치를 시작하는 관계가 없습니다. 전체 시스템을 종료하기 위해 systemd는 다음을 발생시킵니다.shutdown.target
모든 것과 충돌하여 무너지게 됩니다. C가 종료를 중지하고 종료 중에 B를 시작한다고 상상해 보십시오.