시스템 서비스가 다시 시작되면 이메일을 보내는 방법은 무엇입니까?


8

systemd에 의해 서비스로 실행되는 중요한 응용 프로그램이 있습니다.

장애가 발생하자마자 다시 시작하도록 설정되어 있습니다.

응용 프로그램이 다시 시작되면 이메일을 보내는 방법은 무엇입니까?


2
systemd로 수행하는 방법을 모르지만 monit을 사용하면 프로세스를 볼 수 있으며 프로세스 ID가 변경되면 알림을 보낼 수 있습니다.
Zoredache

답변:


16

먼저 메일을 보내기위한 실행 파일과 실행 파일을 시작하기위한 .service 파일이 필요합니다. 이 예제에서 실행 파일은 sendmail다음을 사용하는 쉘 스크립트 일뿐입니다 .

/usr/local/bin/systemd-email:

#!/bin/bash

/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8

$(systemctl status --full "$2")
ERRMAIL

어떤 실행 파일을 사용하든,이 셸 스크립트가 수행하는 것처럼 적어도 두 개의 인수, 즉 보낼 주소와 상태를 가져올 장치 파일이 필요합니다. .service우리는 이러한 인수를 전달합니다 작성 :

/etc/systemd/system/status-email-user@.service:

[Unit]
Description=status email for %i to user

[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal

여기서 user 는 이메일을 보내는 사용자 이고 address 는 해당 사용자의 이메일 주소입니다. 수신자는 하드 코딩되어 있지만보고 할 단위 파일은 인스턴스 매개 변수로 전달되므로이 서비스는 다른 많은 단위에 대한 이메일을 보낼 수 있습니다. 이 시점에서 시작할 수 있습니다 status-email-user@dbus.service당신은 이메일을받을 수 있는지 확인합니다.

그런 다음 이메일을 보내려는 서비스를 편집 OnFailure=status-email-user@%n.service하고 [Unit]섹션에 추가 하십시오. %n장치 이름을 템플릿으로 전달합니다.

출처 : archlinux wiki : 시스템 타이머 MAILTO


그러나 @Dave에는 다른 서비스가 필요하지 않습니다. 그는 이미 사용하고있는 서비스가 시작 / 다시 시작할 때마다 메일을 보낼 수 있기를 원합니다. 이를 위해 ExecStartPost 옵션이 있습니다.
Jaroslav Kucera

@JaroslavKucera 나는 이것을 OP까지 결정할 것이라고 생각합니다 ... :) 또한, ExecStartPost올바른 선택 인지 확실하지 않습니다 : 그것은 실패의 경우뿐만 아니라 "정상"시작 후에 트리거 될 것입니다. ?
gf_

투표가 거부되는 이유에 관심이 있습니다. 목소리를 높이고 말하십시오.
gf_

질문은 다른 서비스에 관한 것이 아니라 기존 서비스의 수정에 관한 것입니다. 예, ExecStartPost는 정상 시작시에도 메일 전송을 트리거합니다. 다시 시작할 때만 작동하는 것을 알지 못합니다.
Jaroslav Kucera

@JaroslavKucera 글쎄, OP는 동의하지 않는 것 같지만 물론 의견을 유지하십시오.
gf_

2

@gf_가 제안한 솔루션은 CentOS7에서 클릭 하우스를 실행하는 상황에서 잘 작동했습니다. 클릭 하우스는 우리에게 다소 정기적으로 충돌하기 때문에 자동으로 다시 시작하고 다시 시작할 때 알림을 받아야했습니다. systemd에 두 번째 서비스를 추가하는 것은 다소 번거로운 것처럼 보이지만 systemd의 디자인으로 인해 필요합니다.

즉,이 솔루션은 자동 재시작과 함께 CentOS8에 배포 할 때 작동하지 않았습니다. 이는 C8에 제공된 systemd v239 OnFailure=가 기본 구성이 아닌 구성 Restart=( Restart=on-failure이 경우) 과 결합 될 때 시맨틱 이 변경 되었기 때문 입니다. 새로운 OnFailure=동작은 충돌 직후가 아니라 재시작이 완전히 실패한 경우에만 원샷 서비스를 트리거합니다. 이 새로운 동작은 서비스를 행복하게 다시 시작하지만 OnFailure=더 이상 호출되지 않은 이메일을 받지 않습니다.

우리의 주요 기대 사항에 주목하십시오 : 우리는 systemd가 프로세스를 재시작하고 이메일 알림을 보내길 원했습니다. v239 업데이트로 gf_에서 인용 한 이전 솔루션이 더 이상 작동하지 않습니다. 다행히도 우리는 이것을 작동시킬 수있었습니다.

우리의 솔루션은 ExecStopPost이메일 알림 스크립트를 호출하는 데 사용 하는 것입니다. 이것은 잘 작동하지만 이제 새로운 문제가 발생했습니다. 서버 시작과 같이 클릭 하우스 서비스가 정상적으로 시작될 때 이메일 알림이 전송되었습니다. 큰 문제는 아니지만 이상적으로는 충돌시 에만 이메일 알림을 받고 싶었습니다 . 이메일 스크립트에 다음 코드를 추가하여이를 달성 할 수있었습니다.

# Don't do anything if the service intentionally stopped successfully. if [ $SERVICE_RESULT == "success" ]; then exit fi

... $SERVICE_RESULT는 systemd에 의해 대상 프로세스에 제공되는 환경 변수입니다 ExecStopPost. success결과 를 확인 함으로써이 호출은 정상적인 시작 또는 종료에서 온 것으로 가정하고 아무 것도 수행하지 않습니다. 과 같은 다른 값에서는 signal스크립트가 계속 이메일을 보냅니다. 이 변수의 가능한 값은 설명서 에 나와 있습니다 .

초기 솔루션을위한 gf_에게 감사합니다. 사람들이 CentOS8에 내 업데이트가 도움이되기를 바랍니다. 나를 도와주는 더 많은 링크 :

  1. /superuser/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. /unix/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. /unix/197636/run-an-arbitrary-command-when-a-service-fails


-1

서버가 부팅되는 동안 서비스 상태를 확인하고 이메일을 보내기 위해 쉘 스크립트를 만들 수 있습니다. 이 링크는 당신을 도울 수 있습니다

/ubuntu/814/how-to-run-scripts-on-start-up


1
이 질문은 부팅에 관한 것이 아니라 서비스 재시작에 관한 것입니다. 부팅 후 꽤 오랜 시간이 걸릴 수 있습니다. 따라서 귀하의 답변이 도움이 될지 확신 할 수 없습니다.
gf_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.