Thêm độ trễ giữa dừng và bắt đầu một quá trình trong systemd


10

Tôi có một vấn đề thực sự kỳ lạ với systemd. Khi tôi phát hành, systemctl restartnó sẽ bắt đầu quá trình mới trước khi kết thúc trước đó.

Điều này có thể được nhìn thấy trong nhật ký, trong đó thông báo tắt máy cuối cùng ("nhật ký đóng") được ghi lại sau thông báo khởi động ("nhật ký mở").

Có cách nào để thêm độ trễ giữa điểm dừng và bắt đầu quá trình không?


Không có gì ngăn bạn chạysystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti 11/07/2016

Tại sao lại lạ thế? Đây là một tính năng thiết kế để bạn một mình giải quyết các vấn đề trong thế giới thực. Tiêm giấc ngủ vào Đơn vị của bạn bắt đầu hoặc sử dụng điều kiện ExecPre để đảm bảo trường hợp cũ hoàn toàn biến mất.
Florian Heigl

Câu trả lời:


12

Trong các tệp dịch vụ systemd của bạn, bạn có thể đặt tùy chọn RestartSec để thêm độ trễ để khởi động lại. Xem ví dụ dưới đây:

[Service]
Restart=always
RestartSec=30

Kiểm tra liên kết này để biết thêm ví dụ.


1
afaik RestartSecchỉ áp dụng cho các dịch vụ được định cấu hình bằng lệnh Restart=và không được tính đến khi thực hiệnsystemctl restart someservice
don_crissti

1

RestartSec dường như chỉ được sử dụng nếu dịch vụ cụ thể đó là dịch vụ được khởi động lại thông qua lệnh khởi động lại systemctl.

Ví dụ: tôi có hai dịch vụ A và B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Nếu bạn thực hiện khởi động lại hệ thống B, nó hoạt động như mong đợi ... nhưng nếu bạn thực hiện khởi động lại hệ thống A, cả hai dịch vụ đều bị dừng và ngay lập tức bắt đầu lại, không chậm trễ.

Systemd rõ ràng chỉ sử dụng các giá trị cấu hình cho một dịch vụ bạn chỉ định và bỏ qua chúng cho bất kỳ phụ thuộc nào.

Điều này không phổ biến như nó có vẻ. Nếu B nói chuyện với một máy chủ từ xa, việc khởi động và dừng nhanh chóng có thể thất bại do đầu cuối từ chối máy khách. Nhưng việc khởi động lại A trực tiếp sẽ xảy ra bất cứ khi nào A được cập nhật mà không thay đổi thành B.

Bạn có thể cũng có thể giải quyết vấn đề này bằng cách thêm độ trễ vào A, nhưng bạn KHÔNG CẦN làm điều này, vì nó phá vỡ sự cô lập đối tượng bằng cách làm cho A biết về B khi nó không phụ thuộ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.