랩톱의 배터리 임계값을 설정하기 위해 다음과 같은 시스템 서비스 장치가 있습니다.
[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=이 정의되어 있지 않거나 서비스가 예기치 않게 종료되는 상황이 포함됩니다. 이 매개변수는 ExecStart=에 대해 설명한 것과 동일한 체계를 따르는 여러 명령줄을 사용합니다. 이러한 설정의 사용은 선택 사항입니다. 지정자 및 환경 변수 대체를 지원합니다. ExecStop=과 달리 이 설정으로 지정된 명령은 서비스가 올바르게 시작되지 않고 다시 종료될 때 호출됩니다.
이 설정은 서비스가 올바르게 시작되지 않는 경우에도 수행해야 하는 정리 작업에 권장됩니다. 이 설정으로 구성된 명령은 서비스가 중간에 시작되지 않고 불완전하게 초기화된 데이터가 남아 있는 경우에도 실행될 수 있어야 합니다. 이 설정으로 지정된 명령이 실행될 때 서비스의 프로세스는 이미 종료되었으므로 해당 프로세스와 통신을 시도해서는 안 됩니다.
이 설정으로 구성된 모든 명령은 $SERVICE_RESULT, $EXIT_CODE 및 $EXIT_STATUS 환경 변수에 설정된 서비스의 결과 코드와 기본 프로세스의 종료 코드 및 상태로 호출됩니다. exec(5) 세부 정보를 참조하세요. .
이 두 가지 모두 서비스가 중지된 동안 명령을 실행하는 데 사용할 수 있습니다.
둘 사이의 주요 차이점은 다음과 같습니다.
ExecStop
기본 프로세스가 계속 실행되는 동안 실행되며 정상적으로 실행된 후 서비스가 중지된 경우에만 실행됩니다. 즉, 모든 서비스가 성공ExecStart
해야 하며ExecStartPre
모든 서비스Conditions...
도 통과해야 합니다.ExecStopPost
"서비스가 예기치 않게 종료되었습니다"라고 하더라도 실행됩니다. 여기에는 오류가 포함됩니다. 이렇게 하면 가장 큰 이점은 여러 개의 가 있을 때 그ExecStart
중 하나가 성공하고 다른 하나는 실패할 경우ExecStopPost
부분적인 성공을 정리하는 데 사용할 수 있다는 것입니다 .