Jalankan Script sekali sehari dengan systemd

13

Saya ingin menjalankan skrip cadangan 10 menit setelah mem-boot mesin saya tetapi hanya sekali sehari. Apakah mungkin untuk membangun skenario seperti itu dengan systemd?

Fu86
sumber
3
Saya tidak sepenuhnya memahami persyaratan Anda, mohon klarifikasi. Saya mengerti bahwa jika Anda me-reboot kali serveral mesin Anda dalam sehari, skrip seharusnya hanya berjalan setelah reboot pertama, benarkah itu? Jika mesin Anda beroperasi lebih dari 1 hari, haruskah skrip dijalankan dalam beberapa hari berturut-turut?
Krzysztof Adamski
Persis. Saya akan membuat cadangan setiap hari tidak peduli seberapa sering saya reboot PC saya.
Fu86
5
Jika Anda tidak terpaku pada systemd, inilah gunanya anacron.
Gilles 'SO- stop being evil'
Saya mungkin salah tetapi tidak ada cara mudah untuk mengatur anacron untuk menjalankan skrip hanya 10 menit setelah booting selesai.
Krzysztof Adamski
Betul. Itu sebabnya saya saat ini menggunakan anacron dan orang tua yang baik, dengan pekerjaan sehari-hari sepertiecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Jawaban:

10

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

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Ini menjalankan .servicefile yang sesuai 15 menit setelah boot dan kemudian setiap hari saat sistem menyala. Jika Anda menyalakan ulang beberapa kali di hari yang sama, Anda dapat meminta skrip cadangan memeriksa waktu arsip dan lewati proses tersebut jika sudah berumur kurang dari satu hari.

Juga, jika cadangan Anda akan berat pada IO, mungkin akan bermanfaat untuk membaca tentang arahan penjadwalan IOS * di halaman systemd.exec (5) .

Craig
sumber
5

Saya tidak berpikir itu mungkin untuk melakukan ini sepenuhnya di systemd karena tidak melacak keadaan apa pun antara reboot. Anda dapat dengan mudah menjadwalkan sesuatu untuk dijalankan 10 menit setelah boot menggunakan systemd.timerdan OnBootSec=atau OnStartupSec=.

Script itu sendiri harus memeriksa apakah sudah berjalan hari ini atau belum. Ini dapat dengan mudah diimplementasikan bahkan dalam bash, misalnya:

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

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE
Krzysztof Adamski
sumber
1

Jika Anda tidak menutup telepon pada 10 menit setelah boot, Anda dapat:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailymembuatnya berjalan setiap tengah malam, Persisten=truesaat boot jika ada setidaknya satu menjalankan tidak terjawab.

x-yuri
sumber
0

Tampaknya masalah ini akan dibahas dalam rilis mendatang. Paling tidak menurut email ini di mailing list systemd-devel. Sampai itu Anda harus pergi dengan cara hack yang diusulkan Krzysztof.

mmh
sumber