Linux Systemd 충돌이 ExecStopPost를 사용하지 않는 것 같습니다.

Linux Systemd 충돌이 ExecStopPost를 사용하지 않는 것 같습니다.

서비스

[Unit]
Description = A-service
Conflicts= B.service
After = network.target

[Service]
PermissionsStartOnly = true
PIDFile = /run/AB/ab.pid
User = root
WorkingDirectory = /root/AB_services
ExecStartPre = /bin/mkdir /run/AB
ExecStartPre = /bin/chown -R root:root /run/AB
ExecStart = /usr/bin/python test_A.py --pid /run/AB/ab.pid
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/AB
PrivateTmp = true

[Install]
WantedBy = multi-user.target

나. 서비스

[Unit]
Description = B-Service
Conflicts = A.service
After = network.target

[Service]
PermissionsStartOnly = true
PIDFile = /run/AB/ab.pid
User = root
WorkingDirectory = /root/AB_services
ExecStartPre = /bin/mkdir /run/AB
ExecStartPre = /bin/chown -R root:root /run/AB
ExecStart = /usr/bin/python test_B.py --pid /run/AB/ab.pid
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/AB
PrivateTmp = true

[Install]
WantedBy = multi-user.target

처음에 부팅했는데 A.service성공적으로 부팅되었습니다. 그러나 시작하면 끝 B.service이 보입니다 A.service. 하지만 ExecStopPost다음과 같은 오류가 발생하여 실행되지 않는 것 같습니다.

/bin/mkdir: cannot create directory ‘/run/AB’: File exists

ExecStopPost정말 불가능한 일인가요 Conflicts? ?

감사해요.

답변1

두 서비스 간에 정렬 제약 조건을 지정하지 않았습니다. 따라서 무슨 일이 일어나고 있는지는 B.service중지(및 실행)가 완료되기 전에 시작(및 실행)된다는 것입니다. 관련 부분mkdirA.servicerm
systemd.unit 문서:

충돌=
이 설정은 After= 및 Before= 순서 종속성과 독립적이며 직교한다는 점에 유의하세요.

 

해결책은 각 서비스 After=목록에 다른 서비스를 추가하는 것입니다( A.service그 반대의 경우도 마찬가지). 관련 섹션도 참조하세요.B.serviceAfter=
문서:

이전=, 이후=
두 장치 사이의 순서 종속성을 고려하여 한 장치가 종료되고 다른 장치가 시작되면 종료 순서가 시작 순서보다 우선합니다. 이 경우 순서 종속성이 After=인지 Before=인지는 중요하지 않습니다. 둘 중 어느 것을 끄는지는 중요하지 않습니다. 하나만 끄고 다른 하나를 시작하면 됩니다. 모든 경우에 시작하기 전에 종료가 명령됩니다.

After=^는 또는 를 사용하는지 여부가 중요하지 않음을 의미합니다 Before=. 그들은 모두 같은 일을 성취할 것입니다.

답변2

감사해요패트릭그러한 설명적인 답변을 통해 내 의심 중 일부가 해결되었습니다.

감사해요알고 싶어요나를 대신해 테스트해 보세요.

~처럼패트릭대답은 정의되지 않은 순서로 인해 오작동할 수 있다고 언급했습니다. 디렉터리가 이미 존재하고 삭제되지 않았으므로 B.service실행할 수 없습니다 .mkdirA.service

  1. 순서를 정의할 수 있습니다. 어느 것이 먼저 시작되든 현재 요구 사항에 따라 동일하게 작동합니다.

  2. 또는 pid두 서비스에 대해 별도의 파일을 만든 다음 디렉터리 대신 파일을 ExecStopPost삭제할 수도 있습니다.pid

두 번째 접근 방식을 따르는 경우에는 이것이 필요하지 않다는 점을 명심하십시오 ExecStartPre.

init.d참고로, 일부 스크립트를 살펴본 후 pid파일을 저장하는 가장 좋은 장소는 /var/run/추가 디렉터리를 만들지 않는 것입니다.해당 위치는 루트에 대해서만 쓰기 금지되어 있으므로 서비스가 루트로 시작된 경우에만 작동합니다.

관련 정보