서비스 실패 시 임의 명령 실행

서비스 실패 시 임의 명령 실행

서비스가 실패할 때 일부 스크립트를 실행하고 싶습니다. 내가 본 가장 가까운 것은 FailureAction=옵션( [Service]섹션 아래)이지만 다시 시작 명령만 제공합니다.

답변1

OnFailure=섹션에 지시어가 있습니다 [Unit].시스템 유닛(5). 이는 다음과 같이 정의됩니다:

이 장치가 "실패" 상태에 들어갈 때 활성화되는 하나 이상의 장치를 공백으로 구분한 목록입니다.

OnFailureJobMode=(동일 섹션에는 OnFailure= 장치를 활성화하기 위해 작업 모드를 설정할 수 있는 지시문도 있습니다 .)

답변2

ExecStopPost장치를 시작하는 대신 명령을 직접 실행할 수도 있습니다 .

저는 이 설정이 마음에 들지 않아서 OnFailure계속 찾아보다가 발견했습니다 ExecStopPost.

git아래의 실제 예에서는 기본 작업이 실패하면 systemd가 명령을 실행합니다 .

[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service

[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter

User=root

# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer

# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .

Restart=always
RestartSec=10
KillSignal=SIGKILL


[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.service.html

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

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

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

관련 정보