Mam zadanie, które należy wykonać zgodnie z harmonogramem projektu (3 tygodnie).
Jestem w stanie skonfigurować crona tak, aby robił to co tydzień lub (na przykład) w trzecim tygodniu każdego miesiąca - ale nie mogę znaleźć sposobu na zrobienie tego co trzy tygodnie.
Mógłbym zhakować skrypt, aby utworzyć pliki tymczasowe (lub podobne), aby mógł się zorientować, że był uruchamiany po raz trzeci - ale to rozwiązanie pachnie.
Czy można to zrobić w czysty sposób?
Odpowiedzi:
Plik crontab pozwala tylko określić:
Nie można więc określić, które tygodnie powinny obowiązywać.
Najlepszym rozwiązaniem może być napisanie skryptu opakowania.
Możesz uzyskać numer tygodnia w skrypcie powłoki za pomocą
lub
w zależności od tego, czy chcesz rozpocząć tydzień w niedzielę czy poniedziałek.
Więc możesz użyć
A czek $ wyniósłby 0 w 1., 4., 7., ... tygodniu roku.
źródło
Dzięki wcześniejszym odpowiedziom wskazano dotychczasowe opcje epoki -e lub formatowanie jako% s
Chociaż trochę bolesne
((date +%s) / 86400)
daje dni z epoki.Polegając na cotygodniowej pracy wykonywanej w tym samym czasie, łatwo jest to sprawdzić na podstawie określonego dnia 3-tygodniowego okresu (
$epoch_day%21 == 13
na przykład)W moim przypadku jest to w porządku, ponieważ jest to jedno zadanie. Jeśli tego dnia przegapisz, nie musisz biegać przy następnej okazji.
źródło
Jeśli możesz zapisać plik znacznika czasu między uruchomieniami, możesz sprawdzić jego datę zamiast polegać wyłącznie na bieżącej dacie.
Jeśli twoje polecenie find obsługuje wartości ułamkowe dla
-mtime
(lub ma-mmin
) ( GNU find ma jedno i drugie , wydaje się , że POSIX również nie wymaga ), możesz „dusić” zadania cron za pomocą funkcji find i touch .Lub, jeśli masz polecenie stat, które obsługuje wyświetlanie dat plików jako „sekund od epoki” (np. Stat z Gnu coreutils , a także innych implementacji), możesz wykonać własne porównanie, używając daty , statystyki i operatorów porównania powłoki (razem przy kontakcie zaktualizować plik znacznika czasu). Możesz także użyć ls zamiast stat, jeśli potrafi formatować (np. Ls z plików GNU ).
Poniżej znajduje się program w Perlu (nazwałem go
n-hours-ago
), który aktualizuje plik znacznika czasu i kończy się pomyślnie, jeśli oryginalny znacznik czasu był wystarczająco stary. Tekst użycia pokazuje, jak używać go we wpisie crontab, aby zdławić zadanie crona. Opisano również korekty dotyczące „oszczędności czasu dziennego” oraz sposób obsługi „późnych” znaczników czasu z poprzednich serii.źródło