Potrzebuję możliwości uruchamiania skryptu PHP 20 razy dziennie w całkowicie losowych momentach. Chcę też, żeby działał tylko między 9:00 a 23:00.
Jestem zaznajomiony z tworzeniem zadań cron w Linuksie.
Potrzebuję możliwości uruchamiania skryptu PHP 20 razy dziennie w całkowicie losowych momentach. Chcę też, żeby działał tylko między 9:00 a 23:00.
Jestem zaznajomiony z tworzeniem zadań cron w Linuksie.
Odpowiedzi:
Jeśli rozumiem, czego szukasz, musisz zrobić coś nieco nieuporządkowanego, na przykład mieć zadanie crona, które uruchamia skrypt bash, który losuje czasy wykonywania ... Coś takiego:
crontab:
0 9 * * * /path/to/bashscript
i w / path / to / bashscript:
#!/bin/bash
maxdelay=$((14*60)) # 14 hours from 9am to 11pm, converted to minutes
for ((i=1; i<=20; i++)); do
delay=$(($RANDOM%maxdelay)) # pick an independent random delay for each of the 20 runs
(sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell to wait, then run the php script
done
Kilka uwag: takie podejście to trochę marnotrawstwo zasobów, ponieważ odpala 20 procesów w tle o 9 rano, z których każdy czeka przez losową liczbę minut (do 14 godzin, tj. 23:00), a następnie uruchamia skrypt php i wyjścia. Ponadto, ponieważ używa losowej liczby minut (nie sekund), czasy rozpoczęcia nie są tak losowe, jak mogłyby być. Ale $ RANDOM rośnie tylko do 32767, a między 9:00 a 23:00 jest 50 400 sekund, trochę bardziej skomplikowane byłoby również losowanie sekund. Wreszcie, ponieważ czasy rozpoczęcia są losowe i niezależne od siebie, możliwe jest (ale mało prawdopodobne), że dwie lub więcej instancji skryptu zostanie uruchomionych jednocześnie.
((maxdelay = 14 * 60))
Lub ((delay = $RANDOM % maxdelay))
). sleep
Argumentem nadal musi być droga trzeba go (choć można dodać spacje, w razie potrzeby).
sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
Tak, tak, pytanie ma ponad rok, ale może mogę dodać coś przydatnego:
Jak cronować coś w losowym przesunięciu 20 razy dziennie między 9:00 a 23:00? To trochę trudne w przypadku crona, ponieważ dzielisz 14 godzin przez 20 czasów wykonania. Inne odpowiedzi mi się nie podobają, ponieważ wymagają napisania skryptu opakowującego bash dla twojego skryptu php.
Jeśli jednak pozwolisz mi złagodzić ograniczenie czasu i częstotliwości do 13 razy między 8:30 a 23:09, może to załatwić sprawę, a wszystko to w ramach twojej tabeli crontab:
30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php
$ {RANDOM: 3: 2} używa basha $ RANDOM, o którym wspominali wcześniej inni ludzie, ale dodaje cięcie tablic basha. Ponieważ zmienne bash nie mają typu, pseudolosowa 16-bitowa liczba ze znakiem jest obcinana do pierwszych 2 z 5 cyfr dziesiętnych, co daje zwięzłą jednowierszową odpowiedź na opóźnienie pracy cron od 10 do 99 minut (chociaż rozkład jest ukierunkowany w kierunku 10 do 32).
Poniższe może również zadziałać dla Ciebie, ale okazało się, że z jakiegoś powodu jest to „mniej przypadkowe” (być może Prawo Benforda jest wyzwalane przez modulację liczb pseudolosowych. Hej, nie wiem, oblałem matematykę ... Winę za to na bash!):
30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php
Musisz wyrenderować moduł jako '\%' powyżej, ponieważ cron (no cóż, przynajmniej Linux 'vixie-cron') kończy linię, gdy napotka niezmieniony '%'.
Być może mógłbyś uzyskać tam pozostałe 7 wykonań skryptów, dodając kolejną linię z kolejnym 7-godzinnym zakresem. Lub rozluźnij swoje ograniczenia, aby biegać między 3:00 a 23:00.
$[(RANDOM/368)+10]
?
$((RANDOM % 90 + 10))
Test:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
$RANDOM
: sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
.
crontab
jest używany bash
przed użyciem $RANDOM
. Jeśli masz vixie-cron
(wydaje się, że jest to mój przypadek na Ubuntu), możesz dodać SHELL=/bin/bash
do góry. Istnieje więcej alternatyw dla innych wersji crona tutaj: superuser.com/a/264541/260350
crontab: errors in crontab file, can't install. Do you want to retry the same edit?
pomoc
Więc używam następującego polecenia, aby uruchomić polecenie między 1 w nocy a 330 w nocy
0 1 * * * perl -le 'sleep rand 9000' && *command goes here*
To zadbało o moje przypadkowe potrzeby. To 9000 sekund == 150 minut == 2,5 godziny
Cron oferuje RANDOM_DELAY
zmienną. Zobacz crontab(5)
szczegóły.
Zmienna RANDOM_DELAY umożliwia opóźnianie uruchamiania zadań o losową liczbę minut z górnym limitem określonym przez zmienną.
Jest to często widoczne w anacron
miejscach pracy, ale może być również przydatne w przypadkucrontab
.
Być może będziesz musiał zachować ostrożność, jeśli masz zadania, które działają z dużą (małą) szczegółowością, a inne, które są zgrubne.
RANDOM_DELAY
jest to ustalane raz i pozostaje niezmienne przez cały czas działania demona.
RANDOM_DELAY
Flaga jest cechą cronie-crond natomiast Ubuntu wydaje się być uruchomione vixie-cron
w którym brakuje tej flagi.
Moją pierwszą myślą byłoby utworzenie jednego zadania crona uruchamiającego 20 losowo zaplanowanych zadań. at
Narzędzie (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) służy do wykonywania poleceń w określonym czasie.
Skończyło się na użyciu sleep $(( 1$(date +%N) % 60 )) ; dostuffs
(kompatybilny z bash & sh)
Prefiks 1 wymusza interpretację daty o wartości innej niż podstawowa 8 +% N (np. 00551454)
Nie zapomnij zmienić znaku% przy użyciu \% w pliku crontab
* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs
date
(co prawdopodobnie robisz na większości Linuksów, ale nie na Busybox, standardowym MacOS lub różnych innych platformach opartych na BSD).
Rozwiązanie al-x nie działa dla mnie, ponieważ polecenia crontab nie są wykonywane w bash, ale chyba w sh. Co działa to:
30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py
$[ ... ]
jest przestarzałą składnią od czasu, gdy wracam; dla czegokolwiek z tego tysiąclecia wolałbyś, $((RANDOM\%90))m
która jest zgodna ze składnią POSIX (ale oczywiście RANDOM
nadal jest tylko Bash).
at -f [file] [timespec]
lub
echo [command] | at [timespec]
lub
at [timespec]
... i interaktywna specyfikacja, jak script
nagranie.
Na uruchamia tekst dostarczany na stdin lub w pliku określonym przez -f [file]
.
Oto [timespec]
gramatyka . Może to być coś takiego:
0100
, 2359
,1620
now + 10 minutes
2071-05-31 - 5 hours 12 minutes UTC
Jeśli wyraźnie określisz strefę czasową, niektóre wersje przedziału czasowego mogą zezwalać tylko UTC
na opcjonalny argument strefa czasowa.
cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
Możesz przetestować parsowanie basha, oczekując na pre-pending echo
i zmieniając wartość |
(pipe).
echo cat script.sh \| at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
echo at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes
Aby zobaczyć zaplanowane zadania, użyj atq
i zawartość zadania (zmienne środowiskowe, konfiguracja i polecenie / skrypt) z at -c [jobid]
.
System jest częścią crona, a interaktywna zachęta faktycznie przechwytuje cały bieżący stan powłoki, dzięki czemu możesz uruchamiać polecenia bez określania bezwzględnych ścieżek.
Dla tych, którzy przeszukali tutaj drogę:
Jeśli używasz anacron (komputer stacjonarny i laptop Ubuntu), możesz edytować
/etc/anacrontab
i dodaj
RANDOM_DELAY=XX
Gdzie XX to ilość minut, o jaką chcesz opóźnić zadanie podstawowe.
Anacron jest jak cron, ale nie oczekuje, że twój komputer będzie działał 24x7 (tak jak nasze laptopy) i uruchomi skrypty, które przegapił, ponieważ system był wyłączony.
Możesz spróbować z tym przykładem użyć losowych czasów przed wykonaniem polecenia:
#!/bin/bash
# start time
date +"%H:%M:%S"
# sleep for 5 seconds
sleep $(shuf -i 1-25 -n 1)
# end time
date +"%H:%M:%S"
A co z tworzeniem skryptu, który codziennie przepisuje plik crontab?
Zdaję sobie sprawę, że to starszy wątek, ale chcę dodać jedną rzecz związaną z losową wartością, której często używam. Zamiast używać zmiennej $ RANDOM ze stałym i ograniczonym zakresem, często tworzę losowe wartości z dowolnego zakresu w powłoce za pomocą
dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none
więc możesz na przykład
FULLRANDOM=$(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none)
i przezwyciężyć niektóre ograniczenia omówione w tym wątku.
~$info dd
i rozumiem, co się dzieje po lewej stronie |
, ale nie mogę dostrzec prawej strony. Tak więc, dla mnie i innych zainteresowanych overcoming some restrictions
generowaniem losowych wartości, może poświęć chwilę na wyjaśnienie RHS i zaproponuj mocniejsze podejście do wykorzystania twojego podejścia. Głębokość wyjaśnień sprawia, że ludzie czują się komfortowo z proponowanym przez ciebie procesem i jego korzyści.