서비스
[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
중지(및 실행)가 완료되기 전에 시작(및 실행)된다는 것입니다. 관련 부분mkdir
A.service
rm
systemd.unit 문서:
충돌=
이 설정은 After= 및 Before= 순서 종속성과 독립적이며 직교한다는 점에 유의하세요.
해결책은 각 서비스 After=
목록에 다른 서비스를 추가하는 것입니다( A.service
그 반대의 경우도 마찬가지). 관련 섹션도 참조하세요.B.service
After=
문서:
이전=, 이후=
두 장치 사이의 순서 종속성을 고려하여 한 장치가 종료되고 다른 장치가 시작되면 종료 순서가 시작 순서보다 우선합니다. 이 경우 순서 종속성이 After=인지 Before=인지는 중요하지 않습니다. 둘 중 어느 것을 끄는지는 중요하지 않습니다. 하나만 끄고 다른 하나를 시작하면 됩니다. 모든 경우에 시작하기 전에 종료가 명령됩니다.
After=
^는 또는 를 사용하는지 여부가 중요하지 않음을 의미합니다 Before=
. 그들은 모두 같은 일을 성취할 것입니다.
답변2
감사해요패트릭그러한 설명적인 답변을 통해 내 의심 중 일부가 해결되었습니다.
감사해요알고 싶어요나를 대신해 테스트해 보세요.
~처럼패트릭대답은 정의되지 않은 순서로 인해 오작동할 수 있다고 언급했습니다. 디렉터리가 이미 존재하고 삭제되지 않았으므로 B.service
실행할 수 없습니다 .mkdir
A.service
순서를 정의할 수 있습니다. 어느 것이 먼저 시작되든 현재 요구 사항에 따라 동일하게 작동합니다.
또는
pid
두 서비스에 대해 별도의 파일을 만든 다음 디렉터리 대신 파일을ExecStopPost
삭제할 수도 있습니다.pid
두 번째 접근 방식을 따르는 경우에는 이것이 필요하지 않다는 점을 명심하십시오 ExecStartPre
.
init.d
참고로, 일부 스크립트를 살펴본 후 pid
파일을 저장하는 가장 좋은 장소는 /var/run/
추가 디렉터리를 만들지 않는 것입니다.해당 위치는 루트에 대해서만 쓰기 금지되어 있으므로 서비스가 루트로 시작된 경우에만 작동합니다.