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

리눅스에서 systemd로 서비스 자동 재시작 및 알림 이메일 설정하기 - 리눅스에서 systemd를 사용하여 서비스가 비정상 종료되면 자동 재시작하고 알림 이메일을 받는 방법을 알아봅니다. systemd의 유닛 파일과 스크립트 파일 작성과 테스트 방법을 설명합니다.
인프라코디
리눅스 root 계정으로 전환하는 방법과 이유, 그리고 주의할 점
리눅스 root 계정 전환 방법, 이유 및 주의할 점을 안내하는 글의 대표 이미지입니다.

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

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