리눅스 systemd 서비스 실패 시 재시작 및 이메일 알림 설정 방법
Rocky Linux 9.2에서 systemd
에 등록한 서비스에 문제가 발생했을 때 자동으로 서비스를 다시 시작하고, 이메일 알림 설정 방법에 대해 알아보겠습니다.
CentOS 7에서는 OnFailure
와 Restart=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
파일에 실행 권한을 추가합니다.
chmod 700 /usr/local/sbin/onfailure.sh
서비스 유닛 파일 알림 설정
알림 테스트를 위해 postfix
서비스 유닛 파일에 Restart
와 ExecStopPost
옵션을 추가해줍니다.
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.
이메일 확인하기
서비스 장애 알림 메일이 왔는지 확인합니다.
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
스크립트 파일을 수정하여 슬랙이나 텔레그램으로도 메시지를 보낼 수 있습니다.
- 블로그 : www.infracody.com
이 글이 유익했나요? 댓글로 소중한 의견을 남겨주시거나 커피 한 잔의 선물은 큰 힘이 됩니다.