필요에 따라 사용자가 시작하고 중지하는 일련의 상호 배타적인 시스템 서비스가 있습니다. 각 서비스에는 일부 하드웨어를 독점적으로 사용해야 하므로 많은 서비스가 서로 충돌합니다. (그러나 모든 서비스가 다른 모든 서비스와 충돌하는 것은 아닙니다)
이 문제를 관리하기 위해 Contributes=를 사용했는데 거의 완벽하게 작동하지만 서비스를 시작하는 ExecStart가 실행 중인 것처럼 보이고 충돌하는 서비스의 ExecStop 스크립트가 여전히 실행 중이므로 하드웨어 리소스가 아직 부족하기 때문에 시작 서비스가 실패하게 됩니다. 사용 가능합니다.
시작 스크립트를 안전한 시간(예: 30초) 동안 절전 모드로 두면 완벽하게 실행되지만 충돌하는 서비스가 중지된 후 즉시 시작하는 것이 좋습니다.
After=는 서비스가 어떤 순서로든 반복적으로 중지되고 시작될 수 있고 After=가 순환 종속성을 유발하기 때문에 작동하지 않는 것 같습니다.
ExecStart 스크립트 내에서 실행 충돌을 확인하지 않고 systemd에서 이 작업을 수행할 수 있는 방법이 있습니까?
답변1
매뉴얼 페이지 systemd.unit(5)
에는내가 말하고 싶은 것은Conflicts=
:
Wants=
이 설정은 위에서 설명한 및 종속성 과 유사한 종속성 순서를 의미하지 않습니다Requires=
. 이는 다른 장치가 시작되기 전에 충돌하는 장치가 중지되도록 하려면After=
또는 종속성을 선언해야 함을 의미합니다.Before=
작업 중지는 항상 작업 시작 전에 정렬되므로 두 가지 정렬 종속성 중 어느 것이 사용되는지는 중요하지 않습니다.Before=
아래/에서 설명을 참조하세요After=
.
즉, 순서 종속성을 선언하면 됩니다.
답변2
내 생각에는 귀하의 ExecStop=
명령이 프로세스에 종료 신호를 보낸 다음 프로세스 종료가 완료되기 직전에 종료하는 등 비동기 작업을 실행하는 것 같습니다.
ExecStop=
명령이 동기 작업이고 서비스가 완전히 종료될 때까지 종료되지 않는지 확인하세요 .
답변3
프로세스가 인 경우 다음 Type=exec
을 사용하여 종료를 요청한 후 종료될 때까지 기다릴 수 있습니다.https://github.com/systemd/systemd/issues/13284#issuecomment-784556633
[Service]
# Type must be set correctly for $MAINPID detection to work
Type=exec
ExecStart=/path/to/myservice/start-command
ExecStop=/path/to/myservice/stop-command
ExecStop=/usr/bin/sh -c 'while kill -0 $MAINPID 2>/dev/null; do sleep 1; done'
TimeoutStopSec=15