Điểm:1

Có thể sử dụng cả hai tùy chọn `Sau=` và `Trước=` cho cùng một đơn vị (dịch vụ) trong dịch vụ systemd không?

lá cờ in

Các Loại=oneshot đơn vị A. dịch vụ được bắt đầu hàng giờ bởi A. hẹn giờ và nó Muốn=B.dịch vụ, nhưng chạy Trước=B.dịch vụ. Đơn vị B. dịch vụ cũng Loại=oneshot. Yêu cầu ở đây là các quy trình của chúng không bao giờ trùng nhau trong thời gian chạy (một Châu đảm bảo chính xác điều đó), tất cả đều tuyệt vời cho đến nay. Bây giờ hãy tưởng tượng một kịch bản trong đó cả hai Mộtb cùng nhau chạy trong hơn một giờ (thời gian giữa A. hẹn giờ đám cháy). Có hai khả năng ở đây:

  1. Một chạy hơn một giờ, sau đó mặc dù A. hẹn giờ muốn kích hoạt và nó có thể làm, bất kể, một trường hợp khác của Một sẽ không được bắt đầu cho đến khi cái đầu tiên kết thúc vì tính duy nhất của phiên bản dịch vụ là một trong những nguyên tắc cơ bản trong hệ thống. Tôi tin rằng nó sẽ chỉ được xếp hàng. Một lần nữa, tất cả đều tuyệt vời cho đến nay, chúng tôi không có nguy cơ chồng chéo các quy trình trong thời gian chạy ở đây.
  2. Một chạy đủ lâu, để b, chạy sau đó, cũng chạy đủ lâu để vượt quá một giờ tổng cộng và kết quả là, A. hẹn giờ cháy để bắt đầu mới Một trong khi b vẫn đang chạy. Đó là nơi chúng tôi gặp phải sự chồng chéo quy trình vì không có Sau=B.dịch vụ Trong A. dịch vụ như đã có Trước=B.dịch vụ.

Về cơ bản, câu hỏi của tôi là liệu nó có hợp lệ không khi có cả hai Sau=B.dịch vụTrước=B.dịch vụ Trong A. dịch vụ ở nơi đầu tiên? Và, tất nhiên, nó có giải quyết được vấn đề chồng chéo được mô tả trong khả năng thứ hai như tôi mong đợi về mặt lý thuyết không? Có cái nào khác không hệ thống-cách giải quyết vấn đề này (ví dụ: tôi không muốn dính líu đến tệp khóa dễ bị lỗi)?

Michael Hampton avatar
lá cờ cz
Thay vào đó, bạn có thể nên đặt một số `Điều kiện...=`.
Điểm:2
lá cờ br

Nếu bạn tạo một Trước = và một Sau = trong bạn A. dịch vụ tệp, bạn sẽ gặp lỗi:

A.service: Công việc B.service/start bị xóa để phá vỡ chu kỳ đặt hàng bắt đầu bằng A.service/start

Bởi vì Systemd không muốn có cả hai phụ thuộc đó trên cùng một đơn vị. Tôi không nghĩ rằng bất kỳ Điều kiện...= từ người đàn ông systemd.unit mà Michael đã đề cập rất phù hợp với nhiệm vụ mà bạn đang cố gắng hoàn thành, trừ khi các lệnh của bạn tạo và sau đó dọn sạch các tệp của chính chúng. Theo cách tôi thấy, bạn có hai giải pháp khả thi chính:

  1. Tạo ra một Điều kiện thực thi= trong bạn A. dịch vụ chạy một lệnh để kiểm tra xem B. dịch vụ đang chạy.Điều này hơi khó thực hiện chỉ với ps và grep từ trong tệp đơn vị của bạn, vì vậy bạn có thể muốn thực thi một số tập lệnh bên ngoài, nhưng bạn đã nói rằng bạn muốn tránh một tệp khóa lộn xộn nên điều đó có thể không lý tưởng.
  2. Sử dụng giải pháp lockfile lộn xộn mà bạn đã đề cập mà bạn không muốn sử dụng
  3. Di chuyển lệnh thứ hai của bạn ra khỏi B. dịch vụ và thành một ExecStopPost= tùy chọn trong A. dịch vụ. Điều này sẽ khiến lệnh thứ hai chỉ chạy sau khi lệnh đầu tiên đã dừng. Nó cũng sẽ ngăn chặn một cái mới A. dịch vụ khỏi chạy trước khi cái đầu tiên kết thúc hoàn toàn. Tôi tin rằng điều này hoàn thành tất cả các mong muốn của bạn, kể từ khi A. dịch vụ lệnh và B. dịch vụ lệnh sẽ không bao giờ được chạy cùng một lúc, hai A. dịch vụ các lệnh sẽ không bao giờ được chạy song song với nhau và các lệnh thực thi mới sẽ chỉ được xếp hàng đợi.

Đây là tệp đơn vị mà tôi đã sử dụng để kiểm tra tùy chọn 3:

[Đơn vị]
Mô tả = A.service cho lỗi máy chủ
[Dịch vụ]
Loại = oneshot
# A. lệnh dịch vụ
ExecStart = /usr/bin/ngủ 3 
# B. lệnh dịch vụ
ExecStopPost = /usr/bin/ngủ 30

Và sau đó thử nghiệm bằng cách sử dụng systemctl bắt đầu A.service nhiều lần trong nhiều cửa sổ đầu cuối, theo dõi tiến trình của các quy trình đang thực sự chạy tại bất kỳ thời điểm nào với ps.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.