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


12

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

답변:


11

OnFailure=섹션 [Unit]에는 systemd.unit (5)에 설명 된 지시문 이 있습니다 . 다음과 같이 정의됩니다.

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

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


이러한 옵션은 스크립트 대신 다른 단위를 시작하는 것처럼 보입니다.
— tshepang

2
@Tshepang : 물론입니다. 체계적으로, 하나의 단위 는 무엇이든 하는 기본 단위 입니다. 스크립트를위한 간단한 단위를 작성하고 /etc/systemd/system그 이름을 OnFailure=지시문에 넣습니다 .
— intelfx

2

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

나는 OnFailure설정에 만족하지 않아서 계속 찾고 찾았습니다 ExecStopPost.

다음 실제 예제는 기본 작업이 실패하면 systemd가 git명령 을 실행합니다 .

[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 환경 변수에 설정된 기본 프로세스의 종료 코드 및 상태뿐만 아니라 서비스 결과 코드와 함께 호출됩니다 (systemd.exec 참조). 자세한 내용은 (5)를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.