리눅스 systemd 서비스 실패 시 재시작 및 이메일 알림 설정 방법

리눅스에서 systemd로 서비스 자동 재시작 및 알림 이메일 설정하기 - 리눅스에서 systemd를 사용하여 서비스가 비정상 종료되면 자동 재시작하고 알림 이메일을 받는 방법을 알아봅니다. systemd의 유닛 파일과 스크립트 파일 작성과 테스트 방법을 설명합니다.
인프라코디
리눅스 systemd 서비스 실패 시 재시작 및 이메일 알림 설정 방법

Rocky Linux 9.2에서 systemd에 등록한 서비스에 문제가 발생했을 때 자동으로 서비스를 다시 시작하고, 이메일 알림 설정 방법에 대해 알아보겠습니다.

CentOS 7에서는 OnFailureRestart=on-failure옵션 설정을 통해 서비스 문제 발생 시 이메일로 알림을 받았습니다. 그런데 Rocky Linux 9.2에서 테스트해보니 서비스는 다시 시작이 되었지만, OnFailure에서 설정한 이메일 발송 스크립트가 실행되지 않았습니다. 그래서 검색해보니 2017년 5월에 출시된 systemd 버전 232에서 장점 $EXIT_STATUS 환경 변수가 추가되며, OnFailure 옵션은 다시 시작할 때 시작 제한 시간에 도달해야만 실패 상태로 들어가며 실행되는 것으로 확인했습니다.

OnFailure= A space-separated list of one or more units that are activated when this unit enters the "failed" state. A service unit using Restart= enters the failed state only after the start limits are reached.

이 장치가 "실패" 상태에 들어갈 때 활성화되는 하나 이상의 장치를 공백으로 구분한 목록입니다. Restart=를 사용하는 서비스 장치는 시작 제한에 도달한 후에만 실패 상태로 들어갑니다.


출처 : https://www.freedesktop.org/software/systemd/man/systemd.unit.html#OnFailure=

음.. 그럼 Rocky Linux 9에서 어떻게 서비스 문제 발생 시 이메일 알림을 설정할 수 있을까요?

바로 ExecStopPost 옵션을 사용하여 서비스를 종료하기 전에 설정한 명령어나 스크립트 파일을 실행하여 알림을 받을 수 있습니다.

이메일 알림 스크립트 파일 작성하기

아래 내용을 따라 하여 이메일을 발송하는 Bash Shell Script 파일을 생성합니다.

vi /usr/local/sbin/onfailure.sh
#!/bin/sh

# 첫 번째 인자로 서비스 이름을 받아옵니다. 인자가 없으면 "unknown"으로 설정됩니다.
svc=${1:-unknown}

# 두 번째 인자로 이메일 주소를 받아옵니다. 인자가 없으면 "infracody@gmail.com"으로 설정됩니다.
email=${2:-infracody@gmail.com}

# /var/log/messages에서 "Out of memory" 문자열을 찾아서 해당 로그와 그 다음 로그를 oom 변수에 저장합니다.
oom=$(/usr/bin/grep -irF -b1 "Out of memory" /var/log/messages)

# SERVICE_RESULT 변수가 "success"인 경우에는 스크립트를 종료합니다.
if [ $SERVICE_RESULT == "success" ]; then
    exit
else
    # 이메일 내용을 작성하고, sendmail 명령어로 이메일을 보냅니다.
    cat <<EOF | sendmail -i "$email"
Subject: [$HOSTNAME] OnFailure Email for $svc

### Out Of Memory History ###
$oom

### $svc Status ###
$(journalctl -n 100 -u "$svc")
EOF
/usr/local/sbin/onfailure.sh 파일 생성
/usr/local/sbin/onfailure.sh 파일 생성

/usr/local/sbin/onfailure.sh 파일에 실행 권한을 추가합니다.

chmod 700 /usr/local/sbin/onfailure.sh

서비스 유닛 파일 알림 설정

알림 테스트를 위해 postfix 서비스 유닛 파일에 RestartExecStopPost 옵션을 추가해줍니다.

systemctl edit postfix.service -l

Service 부문에 추가하면 됩니다.

Restart=on-failure
ExecStopPost=/usr/local/sbin/onfailure.sh postfix.service

아래 postfix.service 부분은 이메일의 제목에 표시할 서비스 이름입니다. nginx.service, mariadb.service 등 해당 서비스의 이름으로 설정하면 됩니다.

ExecStopPost=/usr/local/sbin/onfailure.sh postfix.service

이메일 알림 확인하기

postfix 서비스를 강제로 종료하여, 알림 메일이 정상적으로 발송되는지 확인합니다.

Postfix 서비스 강제 종료 및 재시작 확인하기

systemctl status postfix 명령을 실행하여 PID를 확인하고, kill -9 PID 명령을 실행하여 강제 종료시킵니다.

강제 종료 후 서비스 상태를 다시 확인하여 정상적으로 재시작되었는지 확인합니다.

[root@infracody.com ~]# systemctl status postfix ● postfix.service - Postfix Mail Transport Agent Loaded: loaded (/etc/systemd/system/postfix.service; enabled; preset: disabled) Active: active (running) since Wed 2023-07-26 15:51:08 KST; 2s ago Process: 7206 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=0/SUCCESS) Process: 7207 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS) Process: 7209 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS) Process: 7210 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS) Main PID: 7278 (master) Tasks: 3 (limit: 24648) Memory: 3.2M CPU: 334ms CGroup: /system.slice/postfix.service ├─7278 /usr/libexec/postfix/master -w ├─7279 pickup -l -t unix -u └─7280 qmgr -l -t unix -u Jul 26 15:51:08 rockylinux9-Template systemd[1]: Starting Postfix Mail Transport Agent... Jul 26 15:51:08 rockylinux9-Template postfix/postfix-script[7276]: starting the Postfix mail system Jul 26 15:51:08 rockylinux9-Template postfix/master[7278]: daemon started -- version 3.5.9, configuration /etc/postfix Jul 26 15:51:08 rockylinux9-Template systemd[1]: Started Postfix Mail Transport Agent. [root@infracody.com ~]# kill -9 7278 [root@infracody.com ~]# systemctl status postfix ● postfix.service - Postfix Mail Transport Agent Loaded: loaded (/etc/systemd/system/postfix.service; enabled; preset: disabled) Active: active (running) since Wed 2023-07-26 15:53:02 KST; 4s ago Process: 7314 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=0/SUCCESS) Process: 7315 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS) Process: 7317 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS) Process: 7318 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS) Main PID: 7386 (master) Tasks: 7 (limit: 24648) Memory: 9.6M CPU: 390ms CGroup: /system.slice/postfix.service ├─7386 /usr/libexec/postfix/master -w ├─7387 pickup -l -t unix -u ├─7388 qmgr -l -t unix -u ├─7389 cleanup -z -t unix -u ├─7390 trivial-rewrite -n rewrite -t unix -u ├─7391 smtp -t unix -u └─7392 tlsmgr -l -t unix -u Jul 26 15:53:02 rockylinux9-Template systemd[1]: Starting Postfix Mail Transport Agent... Jul 26 15:53:02 rockylinux9-Template postfix/postfix-script[7384]: starting the Postfix mail system Jul 26 15:53:02 rockylinux9-Template postfix/master[7386]: daemon started -- version 3.5.9, configuration /etc/postfix Jul 26 15:53:02 rockylinux9-Template systemd[1]: Started Postfix Mail Transport Agent. Jul 26 15:53:03 rockylinux9-Template postfix/pickup[7387]: 004E24B: uid=0 from=<root> Jul 26 15:53:03 rockylinux9-Template postfix/cleanup[7389]: 004E24B: message-id=<20230726065303.004E24B@rockylinux9-Template.localdomain> Jul 26 15:53:03 rockylinux9-Template postfix/qmgr[7388]: 004E24B: from=<root@infracody.com>, size=2545, nrcpt=1 (queue active) Jul 26 15:53:03 rockylinux9-Template postfix/smtp[7391]: 004E24B: to=<dongjin.yoon@infracody.com>, relay=smtp.in.infracody.com[192.168.33.250]:25, delay=0.57, delays=0.51/0.05/0/0, dsn=2.0.0, status=sent (…ed as 0EED42019E) Jul 26 15:53:03 rockylinux9-Template postfix/qmgr[7388]: 004E24B: removed Hint: Some lines were ellipsized, use -l to show in full.

이메일 확인하기

서비스 장애 알림 메일이 왔는지 확인합니다.

리눅스 systemd 서비스 실패 시 알림 이메일 화면
리눅스 systemd 서비스 실패 시 알림 이메일 화면

kill -9 명령으로 서비스를 종료했으므로 아래와 같은 로그를 확인할 수 있습니다.

Jul 26 15:37:20 rockylinux9-Template systemd[1]: rsyslog.service: Main process exited, code=killed, status=9/KILL

마무리

Rocky Linux 9에서 서비스에 문제가 발생했을 때 이메일 알림을 받을 수 있도록 설정할 수 있습니다. 서버의 전체 서비스에 설정하기엔 부담스러우므로 주 서비스(web, was, api, db 등)에만 설정해주시면 서비스 문제 발생 시 신속하고 정확하게 문제를 확인하고, 해결 방법을 모색할 수 있습니다.

또한 /usr/local/sbin/onfailure.sh 스크립트 파일을 수정하여 슬랙이나 텔레그램으로도 메시지를 보낼 수 있습니다.

인프라코디
서버, 네트워크, 보안 등 IT 인프라 관리를 하는 시스템 엔지니어로 일하고 있으며, IT 기술 정보 및 일상 정보를 기록하는 블로그를 운영하고 있습니다. 글을 복사하거나 공유 시 게시하신 글에 출처를 남겨주세요.

- 블로그 : www.infracody.com

이 글이 유익했나요? 댓글로 소중한 의견을 남겨주시거나 커피 한 잔의 선물은 큰 힘이 됩니다.
댓글