Czy możliwe jest uruchamianie zadania cron co 30 sekund bez polecenia uśpienia?
Czy możliwe jest uruchamianie zadania cron co 30 sekund bez polecenia uśpienia?
Odpowiedzi:
Jeśli twoje zadanie musi być uruchamiane tak często, cron jest niewłaściwym narzędziem. Oprócz tego, że po prostu nie będzie tak często uruchamiał zadań, ryzykujesz również poważne problemy, jeśli zadanie trwa dłużej niż przerwa między uruchomieniami. Przepisz swoje zadanie w celu demonizacji i trwałego działania, a następnie uruchom je z crona, jeśli to konieczne (upewniając się, że nie uruchomi się ponownie, jeśli już działa).
run-one
upewnić się, że program / nawet skrypt PHP nie uruchamia zduplikowanej instancji. sudo apt-get install run-one
i nazwij torun-one <normal command>
Kandydat na najbardziej twórcze niewłaściwe użycie polecenia Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Jeśli yourprog
składa się z:
date +%M.%S.%N >> yourprog.out
następnie yourprog.out
może wyglądać następująco:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
wskazując na całkiem dobry poziom precyzji.
Oto wyjaśnienie części polecenia:
nohup
- Dzięki temu polecenie, które następuje po nim, watch
w tym przypadku, nie kończy pracy po wyjściu terminala.watch
- Ten program uruchamia polecenie wielokrotnie. Zwykle pierwszy ekran wyniku polecenia jest wyświetlany przy każdym watch
uruchomieniu polecenia.-n 30
- Interwał uruchamiania polecenia. W tym przypadku co trzydzieści sekund.--precise
- Bez tej opcji watch
uruchamia polecenie po upływie kilku sekund. Dzięki niemu każde uruchomienie polecenia rozpoczyna się w interwale, jeśli to możliwe. Gdyby ta opcja nie została podana w przykładzie, czasy byłyby coraz wyższe o ponad 30 sekund za każdym razem ze względu na czas potrzebny do uruchomienia i wykonania polecenia ( yourprog
).yourprog
- Program lub wiersz poleceń watch
do wykonania. Jeśli wiersz poleceń zawiera znaki specjalne dla powłoki (np. Spację lub średnik), należy go zacytować.>/dev/null
- Im większy niż przekierowuje wyjściowe polecenia prowadzony przez watch
do pliku /dev/null
. Plik ten odrzuca wszelkie zapisane na nim dane. Zapobiega to zapisywaniu danych wyjściowych na ekranie lub, ponieważ nohup
jest używane, zapobiega wysyłaniu danych wyjściowych do pliku o nazwie nohup.out
.&
- watch
Polecenie jest uruchamiane w tle, a sterowanie jest zwracane do procesu terminalu lub procesu nadrzędnego.Zauważ nohup
, że przekierowanie wyjścia i &
operator kontroli tła nie są specyficzne dla watch
.
Oto wyjaśnienie przykładowego yourprog
skryptu:
date
- Wyświetla bieżącą datę i / lub godzinę. Może je również ustawić.+%M.%S.%N
- Określa format wyjściowy date
do użycia. %M
jest bieżącą minutą, %S
jest bieżącą sekundą i %N
jest bieżącą nanosekundą.>> yourprog.out
- To przekierowuje wyjście date
polecenia do pliku o nazwie yourprog.out
. Podwójne większe niż powoduje, że dane wyjściowe są dołączane do pliku przy każdym wywołaniu, a nie poprzednia treść jest zastępowana.Edytuj :
Być może inną rzeczą, która może być nadużywana (a może jest to zgodne z prawem) jest systemowy.
Zobacz systemd / Timers jako zamiennik crona i Cron vs systemd timery .
Postaram się wkrótce opublikować przykład.
&
Powoduje polecenie, aby uruchomić w tle, powracając do natychmiastowego kontrolę wiersza polecenia. Użycie nohup
polecenia powoduje, że proces w tle (w tym przypadku watch
) ignoruje sygnał zawieszenia, który jest wysyłany po wyjściu powłoki, na przykład po zamknięciu terminala. ...
>/dev/null
powoduje, że dane wyjściowe są odrzucane i zapobiega tworzeniu nohup.out
pliku, który w innym przypadku zostałby utworzony, gdy standardowe wyjście jest terminalem.
sleep
, musisz napisać pętlę, aby proces się powtórzył ( watch
robi to za ciebie, jak to robi cron
). Nadal będziesz potrzebować nohup
i &
. Dodatkowym problemem sleep
może być przesunięcie czasu. --precise
Opcja watch
unika tego. Bez niego lub podczas używania sleep
w pętli odstęp czasu ma czas potrzebny na uruchomienie poleceń lub skryptu, więc każde uruchomienie jest późniejsze i późniejsze niż ...
Cron jest zaprojektowany tak, aby budził się o każdej minucie, więc nie można tego zrobić bez hakowania, na przykład snu, jak wspomniałeś.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Nie zapomnij napisać czegoś do swojego programu, aby wyjść, jeśli poprzednia instancja już działa.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Oczywiście nadal pozostawia to bardzo małą szansę na awarię, więc wyszukaj w Google lepsze rozwiązanie odpowiednie dla twojego środowiska.
without a sleep command
Możesz to zrobić za pomocą oprogramowania innych firm.
Opcja, która działała dla mnie dobrze, to częsty cron
Umożliwia precyzję w milisekundach i daje możliwość odroczenia następnego wykonania, dopóki bieżąca nie zostanie zakończona.
Miałem kilka problemów:
(1) czasami system jest zajęty i nie może uruchomić rzeczy dokładnie w 30 sekundowym punkcie, wówczas możliwe jest, że w tym samym czasie, gdy wykonujesz jedno zadanie, inne zadanie wyskakuje, a następnie masz 2 (lub więcej) zadań wykonujących to samo rzecz. W zależności od skryptu mogą występować tutaj znaczne zakłócenia. Zatem kodowanie w takim skrypcie powinno zawierać pewien kod, aby zapewnić, że jednocześnie działa tylko jedna instancja danego skryptu.
(2) Skrypt może mieć dużo narzutu i zużywać więcej zasobów systemowych, niż chcesz. Dzieje się tak, jeśli konkurujesz z wieloma innymi działaniami systemowymi.
Tak więc, jak to ujął jeden plakat, w tym przypadku poważnie zastanowiłbym się nad uruchomieniem demona z dodatkowymi procesami, aby upewnić się, że pozostanie uruchomiony, jeśli ma to kluczowe znaczenie dla twoich operacji.
wpis cron:
* * * * * flock -w0 /path/to/script /path/to/script
scenariusz:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
lub
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
polecenia pozwala uniknąć uruchamiania skryptu przez wiele instancji w tym samym czasie. W większości przypadków może to być bardzo ważne.flock
i watch
polecenia są dostępne w większości instalacji Linuksawatch
polecenieRozwiązanie, jeśli dotyczy twojego własnego skryptu lub możesz go owinąć:
Mniej bólu głowy niż budowanie i monitorowanie demona.
* Jeśli używasz PHP, pamiętaj o clearstatcache ().