Điểm:3

Tại sao bộ đếm thời gian systemd của tôi chỉ kích hoạt một lần khi thiết bị là mục tiêu?

lá cờ jp

Tôi có một vài dịch vụ (trình tạo trang tĩnh) mà tôi muốn kích hoạt thường xuyên từ cùng một bộ đếm thời gian systemd. tôi đã tìm thấy câu hỏi/câu trả lời này, bao gồm chính xác những gì tôi muốn làm và mô tả một thiết lập theo đó một .Mục tiêu tập tin đó muốn = nhiều dịch vụ được kích hoạt bởi một bộ đếm thời gian tương ứng. Điều này nghe có vẻ hay, nhưng tôi thấy rằng khi tôi thực sự thiết lập điều này, nó chỉ kích hoạt Một lần, sau đó tự vô hiệu hóa!

Tôi đã chuẩn bị một ví dụ hoạt động tối thiểu (điều này không kích hoạt nhiều dịch vụ, nhưng thể hiện cùng một vấn đề):

test-timer.timer:

[Đơn vị]
Mô tả=Một bộ đếm thời gian kiểm tra

[Hẹn giờ]
OnCalendar=*-*-* *:*:30
Unit=test-timer.target

[Cài đặt]
WantedBy=timers.target

test-timer.target:

[Đơn vị]
Mô tả=Đơn vị mục tiêu
Muốn=test-timer.service
Sau=test-timer.service

[Cài đặt]
WantedBy=timers.target

test-timer.service:

[Đơn vị]
Mô tả=Chạy thử nghiệm

[Dịch vụ]
ExecStart=/usr/bin/bash -c "date --rfc-3339='seconds' >> /tmp/test-timer-output"

[Cài đặt]
Ngoài ra=test-timer.target

Kích hoạt bộ đếm thời gian:

$ sudo cp test-timer.* /etc/systemd/system/
$ Sudo systemctl enable --now test-timer.timer
Đã tạo liên kết tượng trưng /etc/systemd/system/timers.target.wants/test-timer.timer â /etc/systemd/system/test-timer.timer.

Sau đó, khi tôi nhìn vào đầu ra của systemctl list-timers --all, trước lần chạy đầu tiên tôi nhận được (bỏ qua các bộ hẹn giờ khác):

TIẾP THEO TRÁI ĐƠN VỊ VƯỢT QUA CUỐI CÙNG KÍCH HOẠT
Thứ sáu 2021-10-08 10:38:30 EDT 21 giây còn lại n/a n/a test-timer.timer test-timer.target

Sau lần chạy đầu tiên, TIẾP THEOTRÁI đã được thay thế bằng không có:

TIẾP THEO TRÁI ĐƠN VỊ VƯỢT QUA CUỐI CÙNG KÍCH HOẠT
n/a n/a Thứ Sáu 2021-10-08 10:38:32 EDT 1 phút 5 giây trước test-timer.timer test-timer.target

Tôi cũng đã thử thêm Kiên trì = đúng đến test-timer.target và cho phép rõ ràng test-timer.target, nhưng cả hai đều không hoạt động. Bất cứ lúc nào tôi làm systemctl khởi động lại test-timer.timer, nó khởi động lại, nhưng chỉ kích hoạt một lần chạy, sau đó không bao giờ có lần chạy tiếp theo.

Nếu tôi loại bỏ lớp gián tiếp bằng cách thay đổi Đơn vị= dòng test-timer.timer đến Đơn vị=test-timer.service, dịch vụ sẽ tự kích hoạt một cách vui vẻ mỗi phút như mong đợi.

Tôi có thiếu một số bước cấu hình hoặc cài đặt không?

Điểm:3
lá cờ jp

Sau khi nhận được một số trợ giúp trên Twitter, tôi đã giải quyết được vấn đề này. Vấn đề là một systemd hẹn giờ sẽ chỉ kích hoạt các dịch vụ không hoạt động và hành vi mặc định cho một Mục tiêu là kích hoạt và duy trì hoạt động trừ khi có thứ gì đó làm cho nó ngừng hoạt động (nó không bị ràng buộc với thời gian tồn tại của thiết bị mà nó muốn =). Để buộc đơn vị mục tiêu trở nên không hoạt động nếu không tí nào trong số các dịch vụ mà nó kích hoạt trở nên không hoạt động, hãy sử dụng BindsTo= thay cho muốn = trong ví dụ của tôi ở trên. Vì vậy, đối với ví dụ tối thiểu này:

test-timer.target:

[Đơn vị]
Mô tả=Đơn vị mục tiêu
BindsTo=test-timer.service
Sau=test-timer.service

[Cài đặt]
WantedBy=timers.target

test-timer.service:

[Đơn vị]
Mô tả=Chạy thử nghiệm

[Dịch vụ]
ExecStart=/usr/bin/bash -c "date --rfc-3339='seconds' >> /tmp/test-timer-output"

[Cài đặt]
Ngoài ra=test-timer.target

Sau đó, bạn có thể thấy điều đó ngay khi test-timer.service chạy xong rồi test-timer.target cũng sẽ trở thành không hoạt động (và do đó, bộ đếm thời gian sẽ có thể kích hoạt lại):

$ Sudo systemctl list-units --all test-timer.target test-timer.service
  TẢI ĐƠN VỊ HOẠT ĐỘNG MÔ TẢ SUB
  test-timer.service đã tải không hoạt động đã chết Chạy thử nghiệm   
  test-timer.target được tải không hoạt động Đơn vị mục tiêu đã chết

Trong khi trước khi thay đổi, mục tiêu vẫn hoạt động sau khi dịch vụ chết:

$ Sudo systemctl list-units --all test-timer.target test-timer.service
  TẢI ĐƠN VỊ HOẠT ĐỘNG MÔ TẢ SUB
  test-timer.service đã tải không hoạt động đã chết Chạy thử nghiệm   
  test-timer.target đã tải đơn vị Mục tiêu đang hoạt động đang hoạt động
lá cờ za
Dagnabbit, bạn đã tìm thấy giải pháp trước khi tôi có thể đăng nó :-)
karlsebal avatar
lá cờ in
Đặc biệt là khi bạn có nhiều dịch vụ được kích hoạt bởi một mục tiêu và tất cả chúng đều là oneshots, bạn có thể sử dụng `Stop WhenUnneeded=True`. Điều này sẽ khiến mục tiêu trở nên không hoạt động sau khi hoàn thành công việc.
lá cờ ma
Có vẻ như `Stop WhenUnneeded=` hoạt động tốt hơn `BindsTo=`. Với cái sau, tôi gặp lỗi `xxx.target: Bị ràng buộc với đơn vị yyy.service, nhưng đơn vị không hoạt động` bất cứ khi nào mục tiêu được kích hoạt.

Đă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.