시스템 서비스 단위가 비활성화된 경우 어떻게 명령을 실행할 수 있나요?

시스템 서비스 단위가 비활성화된 경우 어떻게 명령을 실행할 수 있나요?

랩톱의 배터리 임계값을 설정하기 위해 다음과 같은 시스템 서비스 장치가 있습니다.

[Unit]
Description=Set Battery Charge Thresholds

[Service]
Type=oneshot
ExecStart=/usr/bin/tpacpi-bat -s --start 1 30
ExecStart=/usr/bin/tpacpi-bat -s --stop 1 85
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

내가 원하는 것은 서비스 장치를 비활성화할 때 명령을 실행하는 방법입니다(따라서 임계값을 기본값으로 편리하게 다시 설정할 수 있습니다). 이것이 가능한가?

답변1

살펴보시 ExecStop거나ExecStopPost

실행 중지

ExecStart=를 통해 시작된 서비스를 중지하기 위해 실행하는 명령입니다. 이 인수는 위의 ExecStart=에 대해 설명한 것과 동일한 체계에 따라 여러 명령줄을 사용합니다. 이 설정의 사용은 선택 사항입니다. 이 옵션에 구성된 명령이 실행된 후 서비스에 남아 있는 모든 프로세스는 KillMode= 설정에 따라 종료됩니다(systemd.kill(5) 참조). 이 옵션을 지정하지 않으면 서비스 중지 요청 시 KillSignal=에 지정된 시그널을 전송하여 프로세스를 종료한다. 지정자 및 환경 변수 대체가 지원됩니다($MAINPID 포함, 위 참조).

...

완전한 종료를 요청하는 서비스와 통신하는 명령에는 이 설정을 사용하는 것이 좋습니다. 이 옵션으로 지정된 명령이 실행되면 서비스가 여전히 완전히 작동 중이고 모든 명령에 올바르게 반응할 수 있다고 가정해야 합니다. 사후 정리 단계에서는 대신 ExecStopPost=를 사용하세요.

ExecStop포스트

서비스가 중지된 후 실행되는 추가 명령입니다. 여기에는 ExecStop=에 구성된 명령이 사용된 경우, 서비스에 ExecStop=이 정의되지 않은 경우 또는 서비스가 예기치 않게 종료된 경우가 포함됩니다. 이 인수는 ExecStart=에 대해 설명한 것과 동일한 체계를 따르는 여러 명령줄을 사용합니다. 이러한 설정의 사용은 선택 사항입니다. 지정자 및 환경 변수 대체가 지원됩니다. – ExecStop=과 달리 – 이 설정으로 지정된 명령은 서비스가 올바르게 시작되지 않고 다시 종료될 때 호출됩니다.

서비스가 올바르게 시작되지 않은 경우에도 실행해야 하는 정리 작업에 이 설정을 사용하는 것이 좋습니다. 이 설정으로 구성된 명령은 서비스 시작이 중간에 실패하고 불완전하게 초기화된 데이터가 남아 있는 경우에도 작동할 수 있어야 합니다. 이 설정으로 지정된 명령이 실행될 때 서비스 프로세스가 이미 종료되었으므로 해당 프로세스와 통신을 시도해서는 안 됩니다.

이 설정으로 구성된 모든 명령은 $SERVICE_RESULT, $EXIT_CODE 및 $EXIT_STATUS 환경 변수에 설정된 서비스의 결과 코드와 기본 프로세스의 종료 코드 및 상태로 호출됩니다. systemd.exec를 참조하세요. (5) 자세한 내용은

이 두 가지 모두 서비스가 중지될 때 명령을 실행하는 데 사용될 수 있습니다.

둘 사이의 주요 차이점은 다음과 같습니다.

  • ExecStop기본 프로세스가 계속 실행되는 동안 실행되며 정상적으로 실행된 후 서비스가 중지된 경우에만 실행됩니다. 즉, 모든 서비스가 ExecStart성공 ExecStartPre해야 하며 모든 서비스 Conditions... 도 통과해야 합니다.

  • ExecStopPost"서비스가 예기치 않게 종료된" 경우에도 실행됩니다. 여기에는 오류가 포함됩니다. 이것의 가장 큰 이점은 여러 개의 가 있을 때 ExecStart그 중 하나가 성공하고 다른 하나가 실패하면 ExecStopPost부분적인 성공을 정리하는 데 사용할 수 있다는 것입니다.

관련 정보