Jak uruchamiać skrypty co 5 sekund?


66

Mam skrypt, który należy uruchamiać co pięć sekund. Wiem, że cronpotrafię wykonywać zadania z każdą minutą, ale czy istnieje sposób na uruchomienie czegoś co sekundę?


3
Jaki problem próbujesz rozwiązać? Czy na pewno cron jest właściwym rozwiązaniem?
andol

1
Wiem, że cron nie jest właściwym rozwiązaniem. Mówiłem, że nie było tego pytania. Proszę przeczytaj. Próbuję uruchomić skrypt co 5 sekund.
myusuf3

2
Przepraszam, chyba źle zrozumiałem pytanie. Jednak wciąż zastanawiam się, czy próbujesz rozwiązać właściwy problem.
andol

Dla ludzi, którzy tu przychodzą i szukają sposobu na uruchomienie czegoś co 5 sekund. Zdecydowanie polecam zamiast tego przyjrzyj się, jak na przykład programować w czasie rzeczywistym za pomocą narzędzi takich jak socket.io.
Brandon Bertelsen,

Czy odkryłeś polecenie bash sleep? sleep 5zatrzymuje się (być może w pętli) na 5 sekund) ...?
SDsolar

Odpowiedzi:


64

Cron pozwala na minimum jedną minutę. Co mógł zrobić, to napisać skrypt z nieskończoną pętlę, która prowadzi swoje zadanie, a potem śpi do 5 sekund. W ten sposób zadanie będzie uruchamiane mniej więcej co 5 sekund, w zależności od tego, jak długo zajmuje samo zadanie.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Możesz utworzyć my-task.shplik z powyższą zawartością i uruchomić go sh my-task.sh. Opcjonalnie możesz skonfigurować go supervisorjako usługę, aby uruchamiał się po uruchomieniu systemu itp.

To naprawdę brzmi, jakbyś robił coś, czego prawdopodobnie nie powinieneś robić. To źle .


Może być potrzebny cron działający co 5 lub nawet mniej sekund, aby można go było używać w skrobakach opartych na PHP.
Ravish Kumar,

Naprawdę źle się czuję. Jeśli umieścisz go w zadaniu cron, będziesz mieć nakładające się zadania co minutę. Po godzinie co 5 sekund rozpocznie się 60 zadań. Jeśli nie bierzesz udziału w pracy crona, możesz nie być w stanie wiedzieć, jak go zatrzymać, a nawet wiedzieć, że istnieje.
SEF

35

cronCo minutę możesz uruchomić skrypt uruchamiający 12 procesów w tle:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

Moje pytanie brzmi jednak: co możesz robić na ZIEMI , który musi działać co 5 sekund?


1
Przydało mi się to, kiedy zrobiłem skrypt, który wielokrotnie sprawdza /mediakatalog w poszukiwaniu dysku, który podłączam do USB w celu automatycznego tworzenia kopii zapasowych ...
VF1

32
What on EARTH- statystyki, wyrzucanie elementów bezużytecznych, synchronizacja plików, status online, nazwij go.
ruX

3
Odwoływanie się do zewnętrznego interfejsu API dla danych prawie w czasie rzeczywistym. Uruchamianie żądania co 5 sekund jest DUŻO lepsze niż robienie tego przy każdym wyświetleniu strony.
Sergey Kudriavtsev

1
Co jeśli crontab wykona plik dostuff.sh dwa razy? Na przykład w 55. chwili skrypt jest wykonywany, ale jeszcze się nie zakończył, ale cron ponownie wywołuje skrypt, co się stanie?
TomSawyer

2
TO JEST ZŁE! Potencjalnie uruchamia skrypt więcej niż jeden raz (jeśli zajmie to więcej niż 5 sekund), co może doprowadzić do wyścigu w dowolnym (nawet tymczasowym) dostępie do plików. NIE Rób tego, jeśli robienie tego samego dwa razy w tym samym czasie może spowodować problem! (I to zwykle będzie!)
Nonny Moose

27

Wystarczy użyć pętli:

while true ; do ./your-script & sleep 5; done

Spowoduje to uruchomienie skryptu jako zadania w tle, uśpienie przez 5 sekund, a następnie powtórzenie pętli. Możesz użyć Ctrl-C, aby go przerwać, lub użyć dowolnego innego warunku zamiast true, np. ! test -f /tmp/stop-my-scriptAby zapętlić tylko, gdy plik /tmp/stop-my-scriptnie istnieje.


Mówię, że jeśli dołączam znak ampersand, to bash: syntax error near unexpected token ';'go wyjąłem. Mam bash 4.3.11. Moje polecenie działa szybko, więc jest w porządku, jeśli działa na pierwszym planie.
Tyler Collier,

1
@TylerCollier Jeśli musiałeś ./your-scriptbiec w tle (podczas 5-sekundowego snu), możesz zatrzymać, &ale upuścić ;. Ponieważ &służy do rozdzielania poleceń, nie jest konieczne (i najwyraźniej niedozwolone) umieszczanie ;po nim w tej samej linii. Innym sposobem jest zapisanie pętli w wielu liniach (z łamaniem linii po &i, opcjonalnie, łamaniem linii dorównież przed i przed done). Ponieważ ;po &wydaje się literówka, usunąłem go. blueyed: Prosimy o odłożenie ;pleców, jeśli naprawdę tego chcesz; jeśli tak, proponuję również dodać wyjaśnienie.
Eliah Kagan

@EliahKagan FWIW, działa na Zsh (bez błędu składniowego), ale nie jest tak naprawdę konieczne. Dzięki za edycję!
niebieskawy

10

Możesz użyć pakietu GNU mcron , alternatywy „Vixie cron”.

http://www.gnu.org/software/mcron/manual/mcron.html#Top

„Z łatwością pozwala na określenie dokładniejszych punktów czasowych, tj. Sekund. Zasadniczo można to rozszerzyć na mikrosekundy, ale nie jest to realizowane”.


Właśnie tego szukałem. Dziękuję Ci!
SDsolar

Prześlij to jako odpowiedź na moje pytanie tutaj: askubuntu.com/questions/922216/… , abym mógł przyjąć twoją odpowiedź.
SDsolar



mcronwymaga sendmaildomyślnej instalacji i aktywacji. jak to wyłączyć?
ihsan,

2

Minimalna konfiguracja w cron to minuty, nie można jej ustawić na 5 sekund. Możesz użyć kwarcu, który pozwala na sekundy. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


Wygląda na to, że Kwarc nie jest oprogramowaniem typu open source. Czy to jest poprawne?
txwikinger

Ma wersję open source. Nie ma strony, ale wystarczy przejść do strony pobierania. Nie musisz wypełniać formularza, po prostu kliknij zabierz mnie do pobrania.
Cody Harlow,

Wydaje się, że open source jak co najmniej 2018 github.com/quartz-scheduler/quartz
dogmatic69

2

Używaj kaktusów do monitorowania routera i przełącznika, ale Cron pozwala tylko na co najmniej jedną minutę, więc jeśli jeden port / urządzenie nie działa, nie ma ostrzeżenia przed upływem dwóch minut.


1
Zalecam edycję tej odpowiedzi, aby rozszerzyć ją o szczegółowe informacje na temat tego, jak to zrobić. (Zobacz także Jak napisać dobrą odpowiedź? Zawiera ogólne porady na temat tego, jakie rodzaje odpowiedzi są uważane za najbardziej wartościowe w Ask Ubuntu.)
David Foerster,

2

Możesz użyć jednostki czasowej SystemD, która uruchomi usługę - skonfigurowaną do robienia tego, co chcesz - co 5 sekund.

Załóżmy, że twoja jednostka serwisowa została wywołana mystuff.servicei jest zainstalowana w /etc/systemd/system(sprawdź usługi użytkownika SystemD, jeśli chcesz zastąpić crontab użytkownika), wtedy możesz napisać jednostkę czasową do uruchomienia usługi w czasie uruchamiania, a następnie co 5 sekund, w ten sposób:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Następnie ponownie załaduj konfigurację systemową, włącz jednostkę czasową i uruchom ją.


1
To najlepsze rozwiązanie, jedynym minusem jest to, że cron jest dużo łatwiejszy do przeglądania i konfiguracji. SystemD jest uciążliwy i zaczyna się od struktury katalogów. Nadal najlepszy na 5 sekundowy interwał
John

Czy powyższy fragment nie przejdzie w /etc/systemd/system/mystuff.timer zamiast mystuff.service?
Brooks

@ Brooks: tak, moje złe - złe kopiowanie i wklejanie po mojej stronie. Naprawiony.
Guss

Dzięki ... Cieszę się, że nie wariuję podczas nauki systemowej :)
Brooks

1

Zrobiłem to bardzo skutecznie (a wynik końcowy pada tygodniami, aż do ponownego uruchomienia komputera). Jeśli chodzi o to, co robiłem teraz, aktualizuję informacje i umieszczam je w pamięci podręcznej - aktualizuję co 10 sekund.

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

„Exec $ 0” ponownie uruchamia skrypt, ale zastępuje działający skrypt. Można go początkowo uruchomić za pomocą wiersza crontab „@reboot”.


8
Dlaczego nie skorzystać z whilepętli zamiast wielokrotnie restartować skrypt?
David Z
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.