StartLimitIntervalSec và StartLimitBurst của Systemd không bao giờ hoạt động


12

Tôi đã cố gắng hạn chế số lượng dịch vụ (trong một container) khởi động lại. Phiên bản HĐH là centos-release-7-5, tệp dịch vụ khá nhiều như bên dưới (đã xóa một số tham số để đọc thuận tiện). Nó sẽ khá dễ dàng như một số bài viết khác đã chỉ ra (Post of Server Fault giới hạn khởi động 1, Post of Stack Overflow giới hạn khởi động lại 2). Tuy nhiên, StartLimitBurst và StartLimitIntervalSec không bao giờ hoạt động với tôi.

Tôi đã thử nghiệm bằng nhiều cách: (1) Tôi kiểm tra dịch vụ PID, hủy dịch vụ bằng "kill -9 ****" nhiều lần. Dịch vụ này luôn được khởi động lại sau 20 giây! (2) Tôi cũng đã cố làm rối tập tin dịch vụ, làm cho container không bao giờ chạy. Tuy nhiên, nó không hoạt động, tập tin dịch vụ cứ tiếp tục khởi động lại.

Bất kỳ ý tưởng?

[Unit]
Description=Hello Fluentd
After=docker.service
Requires=docker.service
StartLimitBurst=2
StartLimitIntervalSec=150s

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker stop "fluentd"
ExecStartPre=-/usr/bin/docker rm -f "fluentd"
ExecStart=/usr/bin/docker run fluentd
ExecStop=/usr/bin/docker stop "fluentd"
Restart=always
RestartSec=20s
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

2
Điều này có ý nghĩa quan trọng hơn việc ai đó quên gõ "Giây", như thể hiện trong các câu trả lời. Tôi không nghĩ sẽ hữu ích khi đóng một câu hỏi như vậy, được hỏi với rất nhiều chi tiết chúng tôi muốn.
sourcejedi

Câu trả lời:


21

StartLimitIntervalSec=đã được thêm vào như một phần của systemd v230. Trong systemd v229 trở xuống, bạn chỉ có thể sử dụng StartLimitInterval=. Bạn cũng sẽ cần phải đặt StartLimitInterval=StartLimitBurst=trong [Service]phần - không phải [Unit]phần.

Để kiểm tra phiên bản systemd của bạn trên CentOS, hãy chạy rpm -q systemd.

Nếu bạn từng nâng cấp lên systemd v230 trở lên, các tên cũ trong [Service]phần sẽ tiếp tục hoạt động.

Nguồn: https://lists.freedesktop.org/archives/systemd-devel/2017-July/039255.html

Bạn có thể gặp vấn đề này mà không thấy bất kỳ lỗi nào, bởi vì systemd bỏ qua các chỉ thị không xác định. systemd giả định rằng nhiều chỉ thị mới hơn có thể bị bỏ qua và vẫn cho phép dịch vụ chạy.

Có thể tự kiểm tra một tệp đơn vị cho các chỉ thị không xác định. Ít nhất là nó dường như hoạt động trên systemd gần đây:

$ systemd-analyze verify foo.service
/etc/systemd/system/foo.service:9: Unknown lvalue 'FancyNewOption' in section 'Service'

Nó thật thú vị. Bạn đề nghị đặt StartLimitBursttrong phần [Dịch vụ], nhưng tài liệu nói rằng nó phải nằm trong phần [Đơn vị]. freedesktop.org/software/systemd/man/systemd.unit.html StartLimitIntervalSec=interval, StartLimitBurst=burst Configure unit start rate limiting. Units which are started more than burst times within an interval time interval are not permitted to start any more.
Ikrom

1
@Ikrom Trong systemd v229 trở xuống
sourcejedi

@sourcejedi Cảm ơn! Chỉ cần kiểm tra systemd trên centos 7 của tôi /usr/lib/systemd/systemd --versionvà nó là v219. Tôi cần phải chăm sóc phiên bản systemd.
Ikrom

+10 nếu tôi có thể. Tôi đã tìm kiếm giải pháp này nhiều lần trước đây (và rõ ràng là rất tệ trong việc googling rõ ràng). Cũng mới với tôi là systemd-analyze. Cảm ơn bạn!
JC Bông

Có vẻ như systemd-analyzechỉ hoạt động đối với các tệp dịch vụ đã được cài đặt, không phải trên (nói) một tệp cục bộ mà bạn đang cố gắng viết nhưng chưa cài đặt. (Ít nhất, đó là những gì dường như là trường hợp trên v219 trong những nỗ lực của tôi để sử dụng nó.) Nếu đó là sự thật, có lẽ đáng để đề cập đến nó trong câu trả lời này.
mhucka

5

Tôi nghĩ rằng tôi đã tìm thấy vấn đề. Tất cả các tài liệu trực tuyến đề xuất rằng tất cả các tham số đều nằm trong tệp UNIT (tệp đơn vị systemd ), nhưng vẫn trong hệ thống của tôi (centos 7.5), chúng nằm trong tệp dịch vụ. Bên cạnh tên là "StartLimitInterval", không phải "StartLimitIntervalSec".

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.