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ę?
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/bashwhile 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:
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”.
„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”.
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.
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.
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:
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”.
sleep 5
zatrzymuje się (być może w pętli) na 5 sekund) ...?Odpowiedzi:
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.
Możesz utworzyć
my-task.sh
plik z powyższą zawartością i uruchomić gosh my-task.sh
. Opcjonalnie możesz skonfigurować gosupervisor
jako usługę, aby uruchamiał się po uruchomieniu systemu itp.To naprawdę brzmi, jakbyś robił coś, czego prawdopodobnie nie powinieneś robić. To źle .
źródło
cron
Co minutę możesz uruchomić skrypt uruchamiający 12 procesów w tle:dostuff.sh
:Moje pytanie brzmi jednak: co możesz robić na ZIEMI , który musi działać co 5 sekund?
źródło
/media
katalog w poszukiwaniu dysku, który podłączam do USB w celu automatycznego tworzenia kopii zapasowych ...What on EARTH
- statystyki, wyrzucanie elementów bezużytecznych, synchronizacja plików, status online, nazwij go.Wystarczy użyć pętli:
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-script
Aby zapętlić tylko, gdy plik/tmp/stop-my-script
nie istnieje.źródło
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../your-script
biec 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 liniido
również przed i przeddone
). 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.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”.
źródło
mcron
wymagasendmail
domyślnej instalacji i aktywacji. jak to wyłączyć?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
źródło
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.
źródło
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.service
i 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
Następnie ponownie załaduj konfigurację systemową, włącz jednostkę czasową i uruchom ją.
źródło
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.
„Exec $ 0” ponownie uruchamia skrypt, ale zastępuje działający skrypt. Można go początkowo uruchomić za pomocą wiersza crontab „@reboot”.
źródło
while
pętli zamiast wielokrotnie restartować skrypt?