Systemd: Làm thế nào để đảm bảo dịch vụ trên mạng oneshot được thử lại nếu lần đầu tiên thất bại?


17

Tôi đã đọc trang quản trị dịch vụ systemd một vài lần, nhưng tôi vẫn không thể tìm ra một mẫu systemd cơ bản:

Tôi muốn chạy quy trình khởi động một lần (như thùng chứa docker hoặc định dạng ổ đĩa) khi khởi động, thành công để hoàn thành. Nhưng nếu tôi sử dụng Type = oneshot cho điều đó, thì tôi không thể sử dụng Restart = on-fail và nếu thất bại, thì nó sẽ không thử lại công việc. Tôi có thiếu một cái gì đó rõ ràng ở đây?

Tôi cũng đã thử cài đặt Type = Simple với Restart = on-fail, nhưng trong nhiều trường hợp tôi cần hành vi sau (từ trang chủ) mà các dịch vụ oneshot đưa ra:

Hành vi của oneshot tương tự như đơn giản; tuy nhiên, quá trình này phải thoát ra trước khi systemd bắt đầu các đơn vị tiếp theo.

Cập nhật:


Một cách giải quyết khác mà tôi đã sử dụng là bỏ qua Restartvà gói my_cmd như thế này: ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'cùng với một số TimeoutStartSecgiá trị hợp lý .
rozcietrzewiacz

Bạn đã xem FailureAction = ? Có thể có thể đạt được điều tương tự như Restart=bằng cách đặt FailureAction=[self.unit](thay thế [self.unit] bằng tên của đơn vị). Đó là loại hacky, nhưng ít nhất là rõ ràng và đủ dễ để làm theo.
Centimane

@Centimane FailureActioncó cùng các giá trị như StartLimitAction, và tất cả ngoại trừ nonekích hoạt tắt một loại nào đó.
jpkotta

Câu trả lời:


5

Một cách giải quyết có thể tôi đang cố gắng là

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30

Trường hợp kịch bản tag.shsẽ touch /ack/TAG_SUCCESSở cuối thực hiện. Tôi tin rằng điều này khá gần với hành vi mong muốn bởi vì ExecStartPresẽ thực hiện tuần tự, chờ hoàn thành thành công trước khi gọi ExecStartvà đơn vị chỉ được xem xét Startingmột lần ExecStartđược gọi bởi điểm mà chúng tôi chắc chắn đã hoàn thành nhiệm vụ khởi động.

Nhưng điều này vẫn cảm thấy như một hack khổng lồ?


Điều này hoạt động tốt với tôi, ngoại trừ việc tôi cũng phải thiết lập RemainAfterExit=yesđể thiết bị luôn hoạt động để các đơn vị khác có thể phụ thuộc vào nó.
Guss
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.