시스템 서비스 반환 코드를 처리하는 스크립트

시스템 서비스 반환 코드를 처리하는 스크립트

systemctl 명령을 사용하여 시작하거나 중지할 수 있는 시스템 서비스를 작성 중입니다.

그러나 프로그램은 내가 처리하고 싶은 여러 반환 코드를 반환할 수도 있습니다.

예를 들어 서비스가 중지되면 systemctl stop <service>어떤 작업도 수행하면 안 됩니다. 그러나 systemctl에 의해 종료되지 않고 자체적으로 반환되는 경우 반환 코드를 가져오고 해당 값에 따라 작업을 수행할 수 있는 포스트스크립트를 실행하고 싶습니다.


@NarūnasK의 답변 이후 수정됨
systemd 버전이 v232보다 크면 @NarūnasK의 답변이 작동합니다.


하지만 좋은 시스템 버전이 없다면 어떻게 될까요?

나는 다음과 같은 것을하고 싶다

ExecStart=/bin/sh -c '<service> -C /etc/<service_conf_file>; [ $? -eq 1 ] && { <action> }'

답변1

실행이 중지된 후=당신이 원하는 것을해야합니다.

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

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

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

스크립트 내에서 환경 $EXIT_CODE변수를 읽고 $EXIT_STATUS적절한 조치를 취할 수 있습니다.

편집하다

다음 해결 방법을 사용할 수 있습니다 systemd < 232.

샘플 스크립트:

#! /bin/bash --

sleep 5

## Non standard exit code
exit 255

종료 핸들러:

#! /bin/bash --

CODE="${1:-N/A}"

echo CODE: $CODE
echo SERVICE_RESULT: $SERVICE_RESULT
echo EXIT_CODE: $EXIT_CODE
echo EXIT_STATUS: $EXIT_STATUS

샘플스크립트.서비스:

# systemctl cat sample_script.service 
# /etc/systemd/system/sample_script.service
[Unit]
Description=My service
After=network.target rsyslog.service

[Service]
Type=simple
Restart=never
ExecStart=/bin/bash -c '/tmp/sample_script || /tmp/exit_handler $?'
ExecStopPost=/tmp/exit_handler

[Install]
WantedBy=multi-user.target

현재 상황샘플스크립트.서비스:

# systemctl status sample_script.service 
● sample_script.service - My service
   Loaded: loaded (/etc/systemd/system/sample_script.service; enabled)
   Active: inactive (dead) since Thu 2017-12-14 12:29:16 GMT; 7s ago
  Process: 16511 ExecStopPost=/tmp/exit_handler (code=exited, status=0/SUCCESS)
  Process: 16505 ExecStart=/bin/bash -c /tmp/sample_script || /tmp/exit_handler $? (code=exited, status=0/SUCCESS)
 Main PID: 16505 (code=exited, status=0/SUCCESS)

Dec 14 12:29:11 build-local systemd[1]: Started My service.
Dec 14 12:29:16 build-local bash[16505]: CODE: 255
Dec 14 12:29:16 build-local bash[16505]: SERVICE_RESULT:
Dec 14 12:29:16 build-local bash[16505]: EXIT_CODE:
Dec 14 12:29:16 build-local bash[16505]: EXIT_STATUS:
Dec 14 12:29:16 build-local exit_handler[16511]: CODE: N/A
Dec 14 12:29:16 build-local exit_handler[16511]: SERVICE_RESULT:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_CODE:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_STATUS:

두 번 호출되는 것을 볼 수 있습니다 exit_handler. 먼저 bash제공되는 종료 코드로 시작한 다음 ExecStopPost=종료 코드에 대한 위치 인수가 제공되지 않는 스크립트로 N/A를 인쇄합니다.

관련 정보