Mam dziwny problem z $ RANDOM w cronie. Chcę wykonać polecenie losowo po kilku minutach od uruchomienia cronjob.
Ten przykład działa bezpośrednio w terminalu i opóźnia polecenie do 30 sekund (zamień polecenie na cokolwiek chcesz, w rzeczywistości jest to echo do / dev / ttyUSB0):
sleep `expr $RANDOM \% 30` ; command
Jeśli ta sama linia zostanie umieszczona w crontab, polecenie zawsze uruchamia się natychmiast bez opóźnienia:
* * * * * sleep `expr $RANDOM \% 30` ; command
Jeśli użyję wyrażenia bez $ RANDOM, działa dobrze - powoduje to opóźnienie 15 sekund:
* * * * * sleep `expr 10 + 5` ; command
Innymi słowy, wygląda na to, że $ RANDOM nie działa w cronie.
Ale to nie tylko dlatego, że $ RANDOM sam ocenia na zero, ponieważ wtedy powinno to dać opóźnienie 10:
* * * * * sleep `expr $RANDOM \% 30 + 10` ; command
Próbowałem też z && instread of; ale to nie pomaga. W rzeczywistości to polecenie wcale nie strzela!
Mógłbym oczywiście umieścić opóźnienie w skrypcie, który jest następnie wywoływany z crontab, ale to nie wyjaśnia mojego problemu i nie każe mi się uczyć :-)
To Debian Lenny, jeśli to robi jakąkolwiek różnicę.
/bin/sh
nie była to rzeczywista powłoka, a jedynie dowiązanie symboliczne do preferowanej powłoki sysadmin (zwykle bash lub dash) na Debianie./bin/sh
(i oczekuje, że będzie ono zgodne z powłoką Bourne'a). Przykładem jestsystem()
funkcja w glibc. Dlatego/bin/sh
zwykle wskazuje na najszybszą powłokę kompatybilną z Bourne; a sysadmin powinien ustawić swoje preferencje we właściwej linii / etc / passwd, aby nie wymuszać tej preferencji wsh
do linkubash
, ale nie wydawało się to istotne.)/bin/sh
wskazuje na myślenie. Do tej pory nigdy nie słyszałem o desce rozdzielczej. Spojrzałem na to i jest to lekki wariant bash. Nie wiedziałem też, że cron działał w „kalekim” środowisku, ale wyjaśnia różne inne problemy, które miałem w przeszłości. Przy okazji, zacząłem używać,$(())
ale ponieważ to nie zadziałało, wypróbowałem różne odmiany i ostatecznie skończyło sięexpr
- co oczywiście też nie działało. Ale na tym skończyłem :-) Czy można uruchomić normalną powłokę bash bez użycia ograniczeńbash -c 'xxxx'
? A tak przy okazji, czy nie można wstawiać podziałów linii w komentarzach?dash
jest powłoką. To nie jest mniej więcej normalne niżbash
. To też nie jest wariant. 2) Patrz punkty 1 i 2 w odpowiedzi.cron
zwykle działa w mniej „pełnym” środowisku, co oznacza, że po prostu nie masz wielu takich samych zmiennych środowiskowych dostępnych. Podobno$RANDOM
jest jednym z takich, w rzeczywistości twojasleep
komenda jest po prostu braku z błędem z powodu zmiennej niezdefiniowanej - czyli dlaczego komenda nie działać w ogóle, kiedy włącza się&&
zamiast;
. (Cóż, w rzeczywistości$RANDOM
jest funkcją Bash, alecron
nie działa w pełnym środowisku Bash, w którym ewidentnie brakuje tej funkcji).Aby wykonać to zadanie, musisz, jak powiedziałeś, użyć osobnego skryptu Bash. Alternatywnie możesz być w stanie wymyślić sposób użycia
cat /dev/urandom
bezpośrednio wcron
poleceniu, ale prawdopodobnie łatwiej byłoby po prostu przenieść to, co aktualnie masz, do osobnego skryptu Bash.źródło
od -An -N1 -i /dev/urandom
\% 30); polecenie$RANDOM
nie jest częścią „pełnego” środowiska. Nie ma to nic wspólnego ze zmiennymi środowiskowymi ustawionymi na początku procesu. Jest to specjalna zmienna stworzona „w locie” w bash. Jego nowa wartość jest zawsze generowana za każdym razem, gdy odczytywana jest zmienna. ---cron
domyślnie używa,/bin/sh
więc systemy, z którymi/bin/sh
nie jest powiązanybash
$RANDOM
, nie będą domyślnie działać.