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


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.