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?
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?
Câu trả lời:
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 .service
chú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.service
xá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.service
vào [Unit]
phần. %n
chuyển tên của đơn vị cho mẫu.
ExecStartPost
có 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 ?
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-failure
trong 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_RESULT
là 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 success
kế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:
Bạn có thể thử sử dụng tùy chọn dịch vụ systemd ExecStartPost.
Mô tả có sẵn ở đây:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
Có thể có nhiều khai báo của tùy chọn này trong tệp định nghĩa dịch vụ. Nó được kích hoạt từng cái một.
Bạn sẽ có một số ví dụ trong hệ thống của bạn là tốt.
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