Mocne wyłączenie określonego skryptu cron. {Godzinny, dzienny, tygodniowy}

25

W różnych systemach, którymi administruję, istnieją skrypty cron uruchamiane za pomocą powszechnie używanego /etc/cron.{hourly,daily,weekly}układu. Chcę wiedzieć, czy istnieje jakakolwiek wspólna funkcja „wyłącz ten skrypt”.

Oczywiście, po prostu usunięcie czegoś z danego katalogu spowoduje jego wyłączenie, ale szukam bardziej trwałego rozwiązania. Usunięcie /etc/cron.daily/slocatezadziała, aby wyłączyć funkcję nocną updatedbna moim komputerze domowym (gdzie nigdy nie używam slocate), ale następnym razem zaktualizuję pakiet Slocate, jestem prawie pewien, że ponownie się pojawi.

Dwie dystrybucje, które najbardziej mnie interesują, to Gentoo i OpenSUSE, ale mam nadzieję, że istnieje szeroko wdrożony mechanizm. Obie dystrybucje, jak je mam, używają vixie-cron (nie jestem pewien, czy to ma znaczenie).

benizi
źródło

Odpowiedzi:

45

Powinieneś być w stanie chmod -x scriptnamewyłączyć skrypt, ale pozostawić plik na swoim miejscu.

Wstrzymano do odwołania.
źródło
5
To może, ale nie musi, zostać cofnięte przez system zarządzania pakietami. Możesz zrobić to bardziej niezawodne, wykonując chattr +i scriptnamepo chmod.
mc0e,
@ mc0e dziękuję za nauczenie mnie o niezmiennych plikach, ale jak ktoś kiedyś powiedział , są przerażające . Gdybym kiedykolwiek zapomniał, co zrobiłem, mogłoby to doprowadzić do bardzo frustrujących problemów.
Jonathan Y.
2
@JonathanY .: Po to lsattrjest - aby usunąć przerażające (zawiera listę atteibutes pliku).
Wstrzymano do odwołania.
1
DW pewnie, ale umiejętność spojrzenia na atrybuty pliku, gdy coś idzie z niewytłumaczalnej przyczyny (tak jak w tym wątku, z którym się łączyłem) jest prawdziwym kopnięciem.
Jonathan Y.
@JonathanY. Więc teraz wiesz. :-) W każdym razie myślę, że „przerażający” fragment w tym powiązanym wątku odnosi się do błędu
Pacmana
9

części wykonawcze nie wykonują zadań, które mają kropki w nazwie, więc

mv /etc/cron.d/job /etc/cron.d/job.disabled

da rade.

chrisv
źródło
1
Niestety będzie to miało ten sam problem podczas aktualizacji programu - sprawdzi, czy zadanie cron istnieje, a ponieważ nie istnieje pod oryginalną nazwą, zostanie odtworzone.
Jenny D mówi Przywróć Monikę
2
Powrót podczas aktualizacji programu jest efektem ubocznym używanego narzędzia pakietowego, którego nie można naprawić za pomocą prostych środków i nie jest to wina Crona. Niektóre systemy pakietów przeglądają i zapisują poprzednie pliki, inne różnią się nowymi i starymi oraz pytają, czy są zmiany do przejrzenia. Niezależnie od tego, aktualizacje, które powodują niezamierzone zachowanie, powinny w tym momencie być frustrującą, ale rutynową częścią administracji systemami uniksowymi. Po prostu zbyt wiele pakietów przesuwa się zbyt szybko, aby regularnie sprawdzać wszystkie zmiany pod kątem ich wpływu w każdym środowisku.
peelman
W Debianie istnieje pojęcie przekierowania pliku - tzn. Możesz skutecznie zmienić nazwę pliku, gdy jest on nadal zarządzany przez menedżera pakietów. Może podobny mechanizm istnieje w Gentoo i / lub SUSE?
Bass
9

Zwykle cron.dailywywoływany jest /etc/crontabprzez linię taką jak np

run-parts --report /etc/cron.daily

man run-parts daje ci opcje.

run-parts --test /etc/cron.daily pokazuje, które zadania są wykonywane bez ich uruchamiania.

Wolę stworzyć podkatalog „Wyłączony” i przenieść tam swoje prace.

W każdym razie, jeśli zaktualizujesz pakiet, jest prawdopodobne, że zadanie wróci na miejsce lub że usunięte bity „x” zostaną przywrócone

Piotr
źródło
1

Możesz usunąć pakiet slocate, jeśli go nigdy nie użyjesz.

Maxfer
źródło
To był tylko przykład, ale wciąż dobra rada, dzięki. (Myślałem, że coś może zależeć od slocate, ale wydaje się, że nic.)
benizi
Usuń slocate i zamiast tego zainstaluj mlocate. Dużo lepiej.
mc0e
1

Jeśli używasz cfengine ( https://cfengine.com/ ), możesz to zrobić z wyłączeniem. Wystarczy napisać plik obietnicy dla grupy hostów, który zastosuje się w następnym uruchomieniu cfagent. Robienie tego z marionetką lub szefem kuchni lub czymkolwiek powinno być również dość proste.

natxo asenjo
źródło
Ciekawy. Zetknąłem się tylko stycznie z narzędziami do zarządzania konfiguracją. Szukałem ogólnego rozwiązania „Mam dowolny arbitralny system podobny do Uniksa”.
benizi
1

The /etc/cron.daily et. glin. skrypty są uruchamiane przez skrypt o nazwie run-parts. Ten skrypt jest różny. Na przykład wspomnianego powyżej przełącznika --test nie ma na komputerze, którego używam w tej chwili.

Run-parts to skrypt bashowy. Jest to ogólnie przydatne narzędzie do uruchamiania wszystkich skryptów w katalogu podanym jako argument. Zwykle znajduje się w / usr / bin / run-parts.

Ma plątaninę logiki przy podejmowaniu decyzji, co uruchomić. Ten kod zawiera odpowiedź na twoje pytanie, ale również jest różny. Musisz więc przeczytać kod, aby być bezpiecznym.

W wersji, na którą patrzę, jest logika, która podczas pracy nad katalogiem <foo> sprawdza, czy <foo> /jobs.deny. Jeśli tak, odmawia uruchomienia samego skryptu wymienionego w tym pliku w wierszu. Zakładając, że masz tę funkcjonalność, jest niesamowita, ponieważ będzie działać, gdy pakiet, który instaluje, zostanie zainstalowany lub zaktualizowany.

Ben Hyde
źródło
0

W przypadku RHEL i pochodnych (które zapewnia crontabspakiet), możesz jawnie wyłączyć zadanie, umieszczając jego nazwę w jobs.denypliku.

Ze strony podręcznika crontabs / run-parts :

Wykonywanie plików można zezwolić lub zabronić, tworząc plik jobs.allow lub jobs.deny, który działał podobnie jak inne pliki konfiguracyjne zezwalaj / odmawiaj. Plik musi zostać utworzony w określonym katalogu.

Przykład /etc/cron.daily/jobs.deny może zawierać na przykład 0logwatch, który zabrania wykonywania tego skryptu.

Shodanshok
źródło
-1

Jeśli nie chcesz też crontabs użytkownika, po prostu wyłącz crond na liście usług.

W Debianie i wersjach opartych na Debianie jest to po prostu kwestia usunięcia dowiązania symbolicznego z odpowiedniego pliku /etc/rcX.d (dla poziomu uruchamiania X).

Nie wiem, jak radzisz sobie z usługami w SUSE lub Gentoo.

jishi
źródło
4
To po prostu zły pomysł. Całkowite wyłączenie crona spowoduje wyłączenie przydatnych zadań konserwacyjnych, takich jak logrotate, updatedb, ewentualnie nienadzorowane aktualizacje i standardowe kopie zapasowe.
Tobu,
Zaktualizowanyb jest dokładnie zadaniem, które próbuję wyłączyć (aktualizuje db dla slocate). Niemniej jednak tak, zła rada w ogóle.
benizi
Przepraszam. Źle odczytałem twoje pytanie i pomyślałem, że chcesz wyłączyć WSZYSTKIE cronjoby specyficzne dla systemu, a nie jedno konkretne.
jishi