답변:
먼저 메일을 보내기위한 실행 파일과 실행 파일을 시작하기위한 .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
장치 이름을 템플릿으로 전달합니다.
ExecStartPost
올바른 선택 인지 확실하지 않습니다 : 그것은 실패의 경우뿐만 아니라 "정상"시작 후에 트리거 될 것입니다. ?
@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에 내 업데이트가 도움이되기를 바랍니다. 나를 도와주는 더 많은 링크 :
시스템 서비스 옵션 ExecStartPost를 사용하려고 할 수 있습니다.
설명은 여기에 있습니다 :
https://www.freedesktop.org/software/systemd/man/systemd.service.html
서비스 정의 파일에이 옵션에 대한 선언이 더있을 수 있습니다. 하나씩 트리거됩니다.
시스템에도 몇 가지 예가 있습니다.
서버가 부팅되는 동안 서비스 상태를 확인하고 이메일을 보내기 위해 쉘 스크립트를 만들 수 있습니다. 이 링크는 당신을 도울 수 있습니다