Odpowiedzi:
Polecenie w crontab jest wykonywane za pomocą, /bin/sh
dzięki czemu można użyć rozszerzenia arytmetycznego, aby obliczyć, czy bieżąca minuta modulo 25 jest równa zeru:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
uruchomi ten cały wpis co 5 minut, ale tylko jeśli bieżąca minuta (w minutach od epoki) moduł 25 równa się zeru, uruchomi się your_command
.
Jak zauważyli inni, 1 dzień nie jest równomiernie podzielny przez 25 minut, więc nie spowoduje your_command
to uruchomienia o tej samej porze każdego dnia, ale będzie on działał co 25 minut.
Najlepszym rozwiązaniem jest uruchomienie w 20 lub 30 minut.
Następnym najlepszym rozwiązaniem może być wyzwalanie co 5 minut, a następnie zachowanie wewnętrznego licznika lub znacznika czasu i uruchamianie co 5 wyzwalaczy lub jeśli upłynęło 25 minut od ostatniego uruchomienia.
Bardziej skomplikowane byłoby ustalenie prawidłowych czasów dla danego dnia, zaczynając od północy, i zaakceptowanie błędu na koniec dnia. Oznaczałoby to powielenie wpisu crontab dla różnych godzin.
Bardziej skomplikowane byłoby wyliczenie czasów na cały miesiąc, co wymagałoby wielu kopii wpisu crontab obejmującego różne kombinacje.
Wreszcie możesz zaimplementować swój własny zawsze na demonie i zlecić to planowaniu.
Nie mam z tym bezpośredniego doświadczenia, ale wydaje się , że fcron robi to, co chcesz od razu po wyjęciu z pudełka. Zgodnie z jego dokumentacją możesz określić częstotliwości:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
powinno załatwić sprawę.
Pozwól, że wyjaśnię krótko, na czym polega problem. Wpisanie 25 w polu minut powoduje cron
, że minuty bieżącego czasu wynoszą 25, czyli raz na godzinę. Możesz wprowadzić listę dopasowań, problem polega na tym, że 60 (minut na godzinę) nie można podzielić przez 25, więc musisz dodać kilka wpisów na podstawie godziny. Najmniejszą wielokrotnością 60 i 25 jest 300, czyli 5 * 60. więc będziesz musiał jechać przez 5 godzin, aż wrócisz do pierwotnego początku. na przykład:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Ale tutaj znowu 24 (godzin dziennie) nie da się podzielić przez 5, najmniejszą wielokrotnością 5 i 24 jest po prostu 5 * 24 = 120. i tak dalej ...
Możesz grać z czasem ostatniej modyfikacji pliku
Utwórz mały skrypt (na przykład /usr/local/bin/age
), który wyświetli wiek pliku:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Twój crontab wyglądałby tak (zakładając, że 25 minut to 1500 sekund, jeśli mam rację)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Zauważ, że używam /var/tmp
zamiast, /tmp
ponieważ zgodnie z FHS nie powinien być usuwany podczas zamykania / uruchamiania systemu.
Myślę, że następujące powinny działać 0 0/25 * * *?