Chạy một lệnh tùy ý khi một dịch vụ thất bại


11

Tôi muốn chạy một số tập lệnh khi một dịch vụ thất bại. Điều gần nhất tôi thấy ở đây là FailureAction=tùy chọn (trong [Service]phần), nhưng nó chỉ cung cấp các lệnh khởi động lại.

Câu trả lời:


11

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ị.)


Có vẻ như các tùy chọn đó bắt đầu các đơn vị khác thay vì chỉ các tập lệnh.
tshepang

2
@Tshepang: Tất nhiên rồi. Trong systemd, một đơn vị là, một đơn vị cơ bản để làm bất cứ điều gì. Viết một đơn vị đơn giản cho tập lệnh của bạn, đặt nó bên dưới /etc/systemd/systemvà đặt tên của nó trong lệnh OnFailure=.
intelfx

2

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 OnFailurethiế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 gitlệ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.

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.