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.