Làm cách nào để gửi email nếu dịch vụ systemd được khởi động lại?


8

Tôi có một ứng dụng quan trọng được chạy như một dịch vụ của systemd.

Nó được thiết lập để khởi động lại ngay khi có lỗi.

Làm thế nào để gửi email nếu ứng dụng khởi động lại?


2
Tôi không biết làm thế nào để làm điều đó với systemd, nhưng với monit bạn có thể yêu cầu nó xem một quy trình và nó có thể gửi thông báo nếu id quá trình thay đổi.
Zoredache

Câu trả lời:


16

Trước tiên, bạn cần hai tệp: một tệp thực thi để gửi thư và một dịch vụ. Để bắt đầu thực thi. Trong ví dụ này, tệp thực thi chỉ là một tập lệnh shell sử dụng 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

Bất cứ thứ gì bạn có thể thực thi được, có lẽ phải mất ít nhất hai đối số vì tập lệnh shell này thực hiện: địa chỉ để gửi đến và tệp đơn vị để có trạng thái. Các .servicechúng ta tạo ra sẽ vượt qua những lập luận này:

/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

Nơi người dùng là người dùng được gửi email và địa chỉ là địa chỉ email của người dùng đó. Mặc dù người nhận được mã hóa cứng, tệp đơn vị để báo cáo được truyền dưới dạng tham số phiên bản, vì vậy dịch vụ này có thể gửi email cho nhiều đơn vị khác. Tại thời điểm này, bạn có thể bắt đầu status-email-user@dbus.servicexác minh rằng bạn có thể nhận được email.

Sau đó, chỉ cần chỉnh sửa dịch vụ bạn muốn gửi email và thêm OnFailure=status-email-user@%n.servicevào [Unit]phần. %nchuyển tên của đơn vị cho mẫu.

Nguồn: archlinux wiki: bộ định thời systemd MAILTO


Nhưng @Dave không yêu cầu dịch vụ khác. Anh ấy muốn dịch vụ mà anh ấy đã sử dụng để có thể gửi thư mỗi lần khởi động / khởi động lại. Cho rằng, có tùy chọn ExecStartPost.
Jaroslav Kucera

@JaroslavKucera Tôi nghĩ rằng điều này sẽ quyết định điều đó cho OP ... :) Ngoài ra, tôi không chắc liệu đó ExecStartPostcó phải là lựa chọn đúng hay không: Nó cũng sẽ kích hoạt sau khi bắt đầu "bình thường", không chỉ trong trường hợp thất bại, phải ?
gf_

Tôi quan tâm tại sao điều này được bỏ phiếu - vui lòng lên tiếng và lên tiếng!
gf_

Bởi vì câu hỏi không phải là về dịch vụ khác, mà là sửa đổi dịch vụ hiện có. Có, ExecStartPost sẽ kích hoạt gửi thư ngay cả khi bắt đầu bình thường. Tôi không biết bất cứ điều gì sẽ chỉ hoạt động khi khởi động lại.
Jaroslav Kucera

@JaroslavKucera Chà, có vẻ như OP không đồng ý, nhưng tất nhiên, hãy giữ ý kiến ​​của bạn.
gf_

2

Giải pháp được đề xuất bởi @gf_ hoạt động tốt cho tình huống của chúng tôi khi chạy clickhouse trên CentOS7. Clickhouse gặp sự cố thường xuyên với chúng tôi vì vậy chúng tôi cần phải tự động khởi động lại và được thông báo khi khởi động lại xảy ra. Mặc dù có vẻ hơi rắc rối khi thêm dịch vụ thứ hai vào systemd, nhưng điều này là cần thiết do thiết kế của systemd.

Điều đó đang được nói, giải pháp này, khi kết hợp với tự động khởi động lại, đã ngừng hoạt động cho chúng tôi khi chúng tôi triển khai lên CentOS8. Điều này là do systemd v239 được vận chuyển trong C8 đã giới thiệu một thay đổi về OnFailure=ngữ nghĩa khi kết hợp với cấu hình không mặc định của Restart=( Restart=on-failuretrong trường hợp của chúng tôi). OnFailure=Hành vi mới chỉ kích hoạt dịch vụ one-shot nếu khởi động lại thất bại hoàn toàn, không chỉ sau một sự cố. Hành vi mới hơn này sẽ vui vẻ khởi động lại dịch vụ, nhưng chúng tôi sẽ không nhận được email vì OnFailure=nó không còn được gọi nữa.

Lưu ý kỳ vọng chính của chúng tôi: chúng tôi muốn systemd khởi động lại quy trình VÀ gửi thông báo email. Bản cập nhật v239 khiến giải pháp trước đây của chúng tôi được trích dẫn bởi gf_ không hoạt động nữa. May mắn thay, chúng tôi đã có thể làm việc này.

Giải pháp của chúng tôi là sử dụng ExecStopPostđể gọi tập lệnh thông báo email. Điều này hoạt động tốt, nhưng bây giờ một vấn đề mới xuất hiện: một thông báo email đã được gửi khi dịch vụ clickhouse khởi động bình thường, chẳng hạn như khi máy chủ khởi động. Trong khi không phải là một vấn đề lớn, tốt nhất là chúng tôi muốn nhận thông báo email chỉ gặp tai nạn. Chúng tôi đã có thể đạt được điều này bằng cách thêm mã sau vào tập lệnh email của chúng tôi:

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

... $SERVICE_RESULTlà một biến môi trường được cung cấp bởi systemd cho quá trình đích của ExecStopPost. Bằng cách kiểm tra successkết quả, chúng tôi giả định rằng lệnh gọi này xuất phát từ một khởi động bình thường hoặc tắt máy và không làm gì cả. Trên bất kỳ giá trị nào khác, chẳng hạn như signal, tập lệnh sẽ tiếp tục gửi email. Các giá trị có thể của biến này được nêu trong tài liệu .

Cảm ơn gf_ cho giải pháp ban đầu. Tôi hy vọng mọi người thấy bản cập nhật của tôi hữu ích cho CentOS8. Một số liên kết khác đã giúp tôi ra:

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


-1

Bạn có thể tạo tập lệnh shell để kiểm tra trạng thái dịch vụ và gửi email trong khi máy chủ khởi động. Liên kết này có thể giúp bạn

https://askubfox.com/questions/814/how-to-run-scripts-on-start-up


1
Câu hỏi này không phải về khởi động, mà là về việc khởi động lại dịch vụ, điều này có thể xảy ra khá lâu sau khi khởi động. Do đó, tôi không chắc câu trả lời của bạn có giúp ích gì không.
gf_
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.