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를 인쇄합니다.