Chạy Script mỗi ngày một lần với systemd


13

Tôi muốn chạy tập lệnh sao lưu 10 phút sau khi khởi động máy nhưng chỉ một lần một ngày. Có thể xây dựng các kịch bản như vậy với systemd?


3
Tôi không hiểu đầy đủ yêu cầu của bạn, xin vui lòng làm rõ. Tôi hiểu rằng nếu bạn khởi động lại máy chủ lần của bạn trong một ngày, tập lệnh chỉ nên chạy sau lần khởi động lại đầu tiên, đúng không? Nếu máy của bạn chạy lâu hơn 1 ngày, tập lệnh có nên chạy trong những ngày liên tiếp không?
Krzysztof Adamski

Chính xác. Tôi sẽ tạo một bản sao lưu mỗi ngày cho dù tôi có thường xuyên khởi động lại PC hay không.
Fu86

5
Nếu bạn không gác máy trên systemd, đây chính xác là những gì anacron dành cho.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi có thể sai nhưng không có cách nào dễ dàng để đặt anacron chạy tập lệnh chỉ 10 phút sau khi khởi động xong.
Krzysztof Adamski

Đúng rồi. Đó là lý do tại sao tôi hiện đang sử dụng anacron và người già giỏi, với công việc hàng ngày nhưecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Câu trả lời:


10

Xem /lib/systemd/system/systemd-tmpfiles-clean.timer::

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Điều này chạy .servicetệp tương ứng 15 phút sau khi khởi động và sau đó mỗi ngày trong khi hệ thống hoạt động. Nếu bạn khởi động lại nhiều lần trong cùng một ngày, bạn có thể có tập lệnh sao lưu kiểm tra thời gian lưu trữ và bỏ qua hoạt động đó nếu nó chưa đến một ngày.

Ngoài ra, nếu các bản sao lưu của bạn sẽ nặng về IO, có thể hữu ích khi đọc về các chỉ thị IOSchedcing * trong trang web systemd.exec (5) .


5

Tôi không nghĩ có thể làm điều này hoàn toàn trong systemd vì nó không theo dõi bất kỳ trạng thái nào giữa các lần khởi động lại. Bạn easly có thể lên lịch một cái gì đó để chạy 10 phút sau khi khởi động sử dụng systemd.timervà nó OnBootSec=hay OnStartupSec=.

Bản thân kịch bản phải kiểm tra xem nó đã được chạy ngày hôm nay hay chưa. Điều này có thể dễ dàng thực hiện ngay cả trong bash, ví dụ:

#/bin/sh -x
FILE=/etc/lastrun
TODAY=`date +"%Y%m%d"`
LASTRUN=`cat $FILE`

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE

1

Nếu bạn không treo máy sau 10 phút sau khi khởi động, bạn có thể:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailylàm cho nó chạy mỗi nửa đêm, Persisten=truekhi khởi động nếu có ít nhất một lần chạy bị bỏ lỡ.


0

Rõ ràng vấn đề này sẽ được giải quyết trong các phiên bản tương lai. Ít nhất là theo email này trong danh sách gửi thư systemd-devel. Cho đến khi bạn phải đi theo cách hackish Krzysztof đề xuất.

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.