Czy mogę sprawić, by cron był „losowy”?


12

Może jestem kompletnie szalony, a jeśli tak, to w porządku. Ale jak mam zaplanować zadanie, aby losowo nadawało głupią wiadomość, na przykład z fortune?

wyjaśnienie
tak - to moja osobista stacja robocza - nie planuję robić nic dziwnego na serwerze produkcyjnym :)

Odpowiedzi:


12

atma prostszy interfejs do tego celu, jeśli atjest zainstalowany, maszyna jest uruchomiona, atda użytkownik może użyć polecenia.

Na przykład (sprawdź dokładną składnię za pomocą man atlub info at),

at -f plik now + 53 minutes

lub

at -f plik now + 2 hours

uruchomi polecenia z określonego pliku odpowiednio za 53 minuty lub 2 godziny.

at można następnie uruchomić ponownie na początku zaplanowanego zadania z odpowiednimi (losowymi lub innymi) startami, liczeniami i jednostkami czasu.

Edytować

Jak pomaga Arjan poniżej, jeśli używasz tego do aplikacji innej niż zabawka, musisz pomyśleć o takich sprawach, jak to, co się dzieje

  1. jeśli następne uruchomienie rozpocznie się przed zakończeniem poprzedniego (np. czy skrypt jest ponownie uruchamiany?) lub

  2. jeśli przebieg nie powiedzie się poprawnie lub

  3. jeśli następne uruchomienie nie rozpocznie się w ogóle lub na czas (np. co się stanie, jeśli maszyna będzie wyłączona, gdy następny bieg ma się rozpocząć) i

  4. na temat rejestrowania i raportowania nieudanych lub udanych uruchomień.


takie podejście nie brałem pod uwagę - i może być rekurencyjne, jeśli filezawiera następny atcykl, prawda?
warren

świetnie - właśnie wypróbowałem i działa świetnie :)
warren

2
+1, ale należy wziąć pod uwagę kilka rzeczy: jeśli at-polecenie jest pierwszym wierszem i jeśli skrypt działa przez długi czas (lub jeśli odstępy są krótkie), należy wystrzegać się jednoczesnego uruchamiania wielu instancji. Ale kiedy znajdzie atsię w ostatnim wierszu skryptu, to oczywiście nie zostanie wykonane ponowne planowanie, jeśli skrypt się nie powiedzie. Również uruchomienie skryptu z wiersza poleceń spowoduje, że sam (ponownie) sam zaplanuje (i: jednocześnie może istnieć wiele harmonogramów). I cronobsługuje wysyłanie wszelkich błędów (lub: dane wyjściowe ogólnie) za pośrednictwem poczty elektronicznej; Nie wiem czy atma coś takiego?
Arjan

@Arjan - Nie martwię się zbytnio o to, że zawiodłem i nie wysyłam e-maila .. ponieważ (w tym momencie) używam go do zabawy na mojej stacji roboczej :) .. jednak - to jest coś, o czym warto pomyśleć gdyby to zostało rozszerzone do, powiedzmy, losowego sprawdzania włamań
warren

scenariusz, który sobie wyobrażam, nie będzie dbał o to, ile jego kopii uruchomi się jednocześnie
warren

13

Mam wiele poleceń w / etc / crontab, które robią różne rzeczy, a niektóre wymagają precyzji w kilka sekund. Teraz cron może mieć lepszą rozdzielczość, a jednocześnie cały czas widoczny i scentralizowany.

Ten przykład pobiera i analizuje stronę internetową między 10 a 50 sekund przed każdymi 5 minutami:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

Nie musi to oznaczać dokładnego czasu, ponieważ dane powoli się przemieszczają, ale pomaga utrzymać czas wykonania węzła Munin na jak najniższym poziomie, bez konieczności oczekiwania na strony internetowe. (Wtyczka dodatkowo buforuje stronę przez 30 minut, aby ograniczyć niepotrzebne działania, ale musi aktualizować bazę danych co 5 minut).

Zauważ, że \% - cron podstawia% na "\ n" - przydatne do utrzymywania tekstu wiadomości w jednym wierszu.


jeśli buforujesz strony internetowe, niekoniecznie będziesz uzyskiwać dokładne wyniki ładowania
warren

1
tak, wiem - „dane powoli się przemieszczają” - wtyczka pobiera kursy wymiany walut z witryny i nie chcę być zbanowana. (Nie jestem traderem, ale spędzam dużo czasu na oglądaniu wykresów Munin). Stworzyłem podobną wtyczkę do lokalnych warunków pogodowych. Niekończące się aplikacje!
Andy Lee Robinson,

1
Aha! .. bardzo fajne podejście :)
warren

6

Wewnętrznie cron, nie sądzę, że taka funkcja istnieje. Myślę, że najlepszym rozwiązaniem byłoby umieszczenie polecenia w skrypcie powłoki, umieszczenie losowego sleepodstępu na górze skryptu i użycie $RANDOMzmiennej. Następnie uruchamiaj skrypt raz dziennie w zwykłej pracy crona.

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

1
sleep () to prawie gwarancja, że ​​zostanie zabity przez usługodawcę. O ile oczywiście nie jest usługodawcą.
Dwarf

1
Zakładałem, że dzieje się to na jego własnej maszynie z Linuksem lub coś takiego, jeśli komuś losowo przekazuje fortunę
John T

to prawda.
Dwarf

Dlaczego sen jest złym pomysłem? Tylko pytam ...
Tadeusz A. Kadłubowski

wyjaśnił pytanie dla @John T
warren

6

Będzie to zależeć od rodzaju interwału, którego szukasz. ale załóżmy, że chcesz, aby skrypt działał losowo z prawdopodobieństwem 1:30 (raz na 30 minut)

  • Zbuduj swój skrypt cron z szybkością, powiedzmy 10 minut. Będzie strzelał 3 razy co 30 minut.

  • Wewnątrz skryptu użyj war jako warunku instrukcji if . Chcesz, aby rand zwrócił liczbę z zakresu od 0 do 2. Jeśli jest to 0, wykonaj treść instrukcji if.

Zasadniczo skrypt zawsze uruchamia się w ustalonych odstępach czasu. Ale wykona polecenie, które Cię interesuje, losowo. Twój usługodawca będzie ci wdzięczny.


@A Karzeł - dziękuję również za ten pomysł - byłaby to nieco bardziej przydatna trasa, gdybym chciał sprawdzać intruzów itp. W częstych, ale quasi-losowych przypadkach
warren
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.