Dịch vụ systemd tự động khởi động lại sau StartLimitInterval


33

Tôi muốn dịch vụ systemd của tôi được tự động khởi động lại khi thất bại. Ngoài ra, tôi muốn đánh giá giới hạn khởi động lại. Tôi muốn cho phép tối đa 3 lần khởi động lại trong thời gian 90 giây. Do đó tôi đã thực hiện các cấu hình sau.

[Dịch vụ]
Khởi động lại = luôn
StartLimitInterval = 90
StartLimitBurst = 3

Bây giờ dịch vụ được khởi động lại khi thất bại. Sau 3 lần thất bại / khởi động lại nhanh, nó không khởi động lại được như mong đợi. Bây giờ tôi dự kiến ​​systemd sẽ bắt đầu dịch vụ sau khi hết thời gian (StartLimitInterval). Nhưng systemd không tự động khởi động dịch vụ sau khi hết thời gian (90 giây), nếu tôi tự khởi động lại dịch vụ sau khi hết thời gian thì nó đang hoạt động. Nhưng tôi muốn systemd tự động khởi động dịch vụ sau StartLimitInterval. Xin vui lòng cho tôi biết làm thế nào để đạt được tính năng này.


3
Tôi đã viết một bài viết giải thích cách tạo một dịch vụ và cách tránh vấn đề cụ thể này: Tạo một dịch vụ Linux với systemd .
Benjamin

2
Tôi nghĩ rằng bạn đang tìm kiếm StartLimitIntervalSec, không phải StartLimitInterval.
Marc Tamsky

Câu trả lời:


30

Để có dịch vụ khởi động lại 3 lần trong khoảng thời gian 90 giây, bao gồm các dòng sau trong tệp dịch vụ systemd của bạn:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Điều này đã làm việc với tôi cho một dịch vụ chạy tập lệnh bằng cách sử dụng 'Type = idle'. Lưu ý rằng 'StartLimitInterval' phải lớn hơn 'RestartSec * StartLimitBurst' nếu không dịch vụ sẽ được khởi động lại vô thời hạn.

Tôi đã mất một thời gian với rất nhiều thử nghiệm và lỗi để tìm ra cách systemd sử dụng các tùy chọn này, điều đó cho thấy systemd không được ghi chép tốt như người ta hy vọng. Các tùy chọn này cung cấp hiệu quả thời gian chu kỳ thử lại và thử lại tối đa mà tôi đang tìm kiếm.


Điều này nên được đánh dấu là câu trả lời được chấp nhận ...
Jeff

không thể tìm thấy StartLimitInterval=chỉ thị trong Ubuntu 18 mới nhất của tôi ...
bấc

10

Hành vi bạn mô tả phù hợp với tài liệu:

StartLimitInterval =, StartLimitBurst = Định cấu hình giới hạn tốc độ bắt đầu dịch vụ. Theo mặc định, các dịch vụ được khởi động hơn 5 lần trong vòng 10 giây không được phép bắt đầu thêm bất kỳ lần nào cho đến khi khoảng thời gian 10 giây kết thúc. Với hai tùy chọn này, giới hạn tỷ lệ này có thể được sửa đổi. Sử dụng StartLimitInterval = để định cấu hình khoảng thời gian kiểm tra (mặc định là DefaultStartLimitInterval = trong tệp cấu hình trình quản lý, được đặt thành 0 để vô hiệu hóa bất kỳ loại giới hạn tốc độ nào). Sử dụng StartLimitBurst = để định cấu hình số lượng bắt đầu cho mỗi khoảng thời gian được phép (mặc định là DefaultStartLimitBurst = trong tệp cấu hình trình quản lý). Các tùy chọn cấu hình này đặc biệt hữu ích khi kết hợp với Restart =; tuy nhiên, chúng áp dụng cho tất cả các loại khởi động (bao gồm cả thủ công), không chỉ những loại được kích hoạt bởi Restart = logic.Lưu ý rằng các đơn vị được cấu hình cho Khởi động lại = và đạt đến giới hạn bắt đầu không được cố gắng khởi động lại nữa; tuy nhiên, chúng vẫn có thể được khởi động lại thủ công vào thời điểm sau, từ thời điểm đó, logic khởi động lại được kích hoạt lại. Lưu ý rằng systemctl reset-fail sẽ khiến bộ đếm tốc độ khởi động lại cho một dịch vụ bị xóa, điều này rất hữu ích nếu quản trị viên muốn tự khởi động một dịch vụ và giới hạn bắt đầu can thiệp vào điều đó.

Tôi vẫn đang cố gắng tìm ra cách để thực hiện hành vi mà bạn mong muốn.


Đây là một nhận xét nhiều hơn là một câu trả lời như bạn chỉ ra.
Dave M

chính xác những gì tôi cần, ty
Một số Linux Nerd

Theo tài liệu bạn đã liên kết, không nên StartLimitIntervalSec=(và DefaultStartLimitIntervalSec=)? Lưu ý việc thêm Secvào cả hai tên tham số.
Doktor J

6

Vài năm sau và với systemd 232, nó không còn hoạt động như được mô tả trong câu hỏi và trong các câu trả lời từ năm 2016. Tên tùy chọn StartLimitIntervalSecvà Phần đã thay đổi. Bây giờ nó phải giống như ví dụ này:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Điều này sẽ thực hiện 5 lần khởi động lại trong 30 giây (5 * 6) cộng với một lần khởi động lại trong 33 giây. Vì vậy, chúng tôi có 6 khởi động lại trong 33 giây. Điều này vượt quá giới hạn 5 lần khởi động lại trong 33 giây. Vì vậy, khởi động lại sẽ dừng ở 5 đếm sau khoảng 31 giây.


1
Có vẻ như StartLimitIntervalvẫn được hỗ trợ, nếu không có giấy tờ, trong Servicephần. Nhưng mới, ưa thích StartLimitIntervalSecchỉ hoạt động trong Unit.
Danek Duvall

1

Bạn có thể thiết lập OnFailuređể bắt đầu một dịch vụ khác khi điều này không thành công. Trong dịch vụ không thành công, bạn có thể chạy tập lệnh chờ và sau đó khởi động lại dịch vụ của mình.

Để biết mẫu về cách thiết lập tính năng này, hãy xem thư trạng thái Systemd về lỗi đơn vị và sửa đổi nó để khởi động lại dịch vụ thay thế.


1

Bạn có thể sử dụng StartLimitAction=reboot. Điều này sẽ khởi động lại hệ thống sau StartLimitInterval.

StartLimitAction = Định cấu hình hành động cần thực hiện nếu giới hạn tốc độ được định cấu hình với StartLimitInterval = và StartLimitBurst = được nhấn. Mất một trong số đó, khởi động lại, khởi động lại lực lượng hoặc khởi động lại ngay lập tức. Nếu không được đặt, nhấn giới hạn tốc độ sẽ kích hoạt không có hành động nào ngoài việc bắt đầu sẽ không được phép. khởi động lại gây ra khởi động lại theo quy trình tắt máy thông thường (nghĩa là tương đương với khởi động lại systemctl). khởi động lại lực gây ra khởi động lại bắt buộc sẽ chấm dứt tất cả các quy trình một cách cưỡng bức nhưng sẽ không gây ra hệ thống tệp bẩn khi khởi động lại (nghĩa là tương đương với systemctl restart -f) và khởi động lại ngay lập tức thực hiện cuộc gọi hệ thống khởi động lại (2), điều này có thể dẫn đến trong mất dữ liệu. Mặc định là không có.

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.