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:
- 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.
- 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
- 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
.