Czy istnieje sposób uruchamiania skryptu co minutę (lub 2, 5 itd.), Ale tylko wtedy, gdy jeszcze nie jest uruchomiony?
Mamy zestaw skryptów, które muszą być uruchamiane co minutę. Czasami mogą zacząć i zakończyć za sekundę, innym razem mogą trwać 5 minut.
Nasz obecny sposób na unikanie jednoczesnych wykonywania polega na ustawieniu is_running
flagi w każdym skrypcie i wyjściu z niego, jeśli nadal jest włączony. Jest to jednak trochę zawodna (tzn. Błędy krytyczne spowodowałyby, że flaga pozostała włączona nawet po zatrzymaniu skryptu).
Moglibyśmy napisać własnego małego menedżera, ale zastanawiam się, czy istnieje bardziej modne rozwiązanie, które już istnieje.
Odpowiedzi:
lepszym sposobem jest użycie
flock
zamiast pliku pid. sprawdź stronę: flock (1) . Zaletą jest to, że bez względu na to, jak proces się zakończy / umrze, zamek zniknie wraz z nim.źródło
Zwykle zgadzam się z odpowiedzią na plik pid Warnera. Jednak czy spełnia to następująca funkcja Anacron?
Sam tego nie testowałem, dokumentacja anakrona nie jest wystarczająco dokładna ...
Jeśli chcesz być wyjątkowo leniwy ;-) Możesz po prostu wyjść ze skryptu, jeśli greping przez wyjście ps zwróci proces jako uruchomiony. Ale plik blokady / pid jest najlepszy.
źródło
anacron
i cocron
robią, nakładają się pewne elementy , ale rozwiązują one różne problemy. Używająccron
, jak rozpoczniesz pracę, która została pominięta z powodu awarii maszyny? Używającanacron
, jak zacząłbyś pracę co 25 grudnia lub co 5 minut? (Możesz oczywiście obejść skrypty, ale nie o tym mówię.)anacron
nie działa w okresach krótszych niż jeden dzień.To właściwe rozwiązanie dla tego podejścia. Zwykle używany byłby plik pid i test pid byłby przeprowadzany względem procesu, aby upewnić się, że jest uruchomiony. Jeśli nieaktualny, plik blokujący zostanie usunięty, a proces i tak zostanie uruchomiony.
Każda dodatkowa inteligencja byłaby zazwyczaj zapisywana w samym oprogramowaniu, jako demon, w przeciwieństwie do uruchamiania w cronie.
źródło
Jeśli twoje skrypty są zakodowane w języku, który obsługuje syscall flock (2), możesz także flock () plik blokady z wywołaniem funkcji. Przykład:
Jeśli utkniesz w Bash lub innym języku skryptowym, który tego nie obsługuje, proponowane rozwiązanie z flock (1) również jest w porządku.
PS W każdym razie oddzielny plik blokady należy utworzyć tylko raz (jeśli jeszcze nie istnieje) i nigdy go nie usuwać. Katalog „/ var / lock” jest dobrym miejscem na takie pliki.
źródło
Jest to rozwiązanie, jeśli twój skrypt działa w Pythonie (lub możesz utworzyć komendę Python, aby działała przed następną komendą) - napotkałem dokładnie ten problem w zeszłym tygodniu i chociaż znalazłem dobre rozwiązania, postanowiłem zrobić bardzo prosty i czysty pakiet Pythona i przesłałem go do PyPI. Z pewnością możesz zablokować,
__file__
aby nie myśleć o nadaniu mu niestandardowej nazwy zasobu do zablokowania.Zainstaluj za pomocą:
pip install quicklock
Korzystanie z niego jest niezwykle proste:
Spójrz: https://pypi.python.org/pypi/quicklock
źródło