Câu trả lời:
Có một OnFailure=
chỉ thị trong phần [Unit]
, được ghi lại trong systemd.unit (5) . Nó được định nghĩa như sau:
Danh sách được phân tách bằng dấu cách của một hoặc nhiều đơn vị được kích hoạt khi đơn vị này vào trạng thái "không thành công".
(Ngoài ra, có một lệnh OnFailureJobMode=
trong cùng một phần cho phép đặt chế độ công việc để kích hoạt OnFailure = đơn vị.)
/etc/systemd/system
và đặt tên của nó trong lệnh OnFailure=
.
Bạn cũng có thể sử dụng ExecStopPost
để chạy lệnh trực tiếp thay vì bắt đầu một đơn vị.
Tôi không hài lòng với các OnFailure
thiết lập vì vậy tôi tiếp tục tìm kiếm ExecStopPost
.
Ví dụ thực tế sau đây, nếu tác vụ chính thất bại thì systemd sẽ chạy một git
lệnh.
[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service
[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter
User=root
# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer
# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .
Restart=always
RestartSec=10
KillSignal=SIGKILL
[Install]
WantedBy=multi-user.target
https://www.freedesktop.org/software/systemd/man/systemd.service.html
ExecStopPost = Các lệnh bổ sung được thực thi sau khi dịch vụ bị dừng. Điều này bao gồm các trường hợp các lệnh được cấu hình trong ExecStop = đã được sử dụng, trong đó dịch vụ không có bất kỳ ExecStop = nào được xác định hoặc khi dịch vụ thoát ra bất ngờ. Đối số này có nhiều dòng lệnh, theo cùng sơ đồ như được mô tả cho ExecStart =. Sử dụng các cài đặt này là tùy chọn. Công cụ thay thế và biến môi trường được hỗ trợ. Lưu ý rằng - không giống như ExecStop = - các lệnh được chỉ định trong cài đặt này được gọi khi dịch vụ không khởi động đúng và bị tắt lần nữa.
Nên sử dụng cài đặt này cho các hoạt động dọn dẹp sẽ được thực hiện ngay cả khi dịch vụ không khởi động đúng. Các lệnh được định cấu hình với cài đặt này cần có khả năng hoạt động ngay cả khi dịch vụ không khởi động được nửa chừng và để lại dữ liệu khởi tạo không đầy đủ xung quanh. Vì các quy trình của dịch vụ đã bị chấm dứt khi các lệnh được chỉ định với cài đặt này được thực thi, chúng không nên cố gắng giao tiếp với chúng.
Lưu ý rằng tất cả các lệnh được định cấu hình với cài đặt này được gọi với mã kết quả của dịch vụ, cũng như mã và trạng thái thoát của quy trình chính, được đặt trong các biến môi trường $ SERVICE_RESULT, $ EXIT_CODE và $ EXIT_STATUS, xem systemd.exec (5) để biết chi tiết.