Różnica między używaniem crontab i /etc/cron.hourly,daily,weekly

12

Mam zaplanowany skrypt, który co godzinę wykonuje kopię zapasową svnsync naszych repozytoriów Subversion. Uruchomiłem go z wpisu w głównym pliku crontab bez problemów, ale zdecydowałem, że chcę go uruchomić z /etc/cron.hourly zamiast tego dla dodatkowej widoczności (i ponieważ jeden z naszych inżynierów przypadkowo usunął crontab, ponieważ pomyślał „crontab” -r „znaczył” czytać crontab ;-))

Wszystkie komendy svnsync w skrypcie cron.hourly kończą się niepowodzeniem z komunikatem, że certyfikat SSL dla repozytorium SVN musi zostać zaakceptowany (jest to komunikat, który otrzymujesz interaktywnie, gdy użytkownik uzyskuje dostęp do repozytorium SVN, ale gdy certyfikat I zaakceptowano wiadomość nie pojawia się ponownie).

Wydaje mi się więc, że skrypt jest uruchamiany w innym środowisku użytkownika, gdy jest uruchamiany z cron.hourly, niż gdy jest uruchamiany przez root crontab. Czy ktoś może wyjaśnić różnicę?

AKTUALIZACJA: Powinienem wspomnieć o mojej dystrybucji, używam anakronu w CentOS 5.1.

AKTUALIZACJA 2: Dzięki za dotychczasowe sugestie; Myślę, że to staje się bardziej pytaniem Subversion. Zawsze staram się umieszczać moje środowisko w skryptach, ale problem polega na tym, że nie jestem pewien, co to jest (lub czego nie ma) w środowisku, które powoduje, że SVN prosi o akceptację certyfikatu SSL po uruchomieniu skryptu z cron.hourly. Zgaduję, że ma to związek ze sposobem wykonania skryptu części wykonawczych.

gareth_bowles
źródło
1
Przydałoby się dołączyć wybrany pakiet dystrybucyjny i cron.
Dan Carley,

Odpowiedzi:

4

Chcesz użyć opcji „--config-dir”, aby poinformować go, gdzie znaleźć zaakceptowany certyfikat (np. Domyślnie ~ / .subversion).

To powiedziawszy, jestem prawie pewien, że lepiej byłoby wywołać svnsync ze skryptu hooks / post-commit, jak sugerowano gdzie indziej . Wtedy twoje lustro jest zawsze zsynchronizowane, a nie zsynchronizowane z miejscem, w którym twój mistrz był godzinę temu.

James Cape
źródło
16

W systemie Debian / Ubuntu cron.daily | weekly | montly jest uruchamiany z głównego crontab.

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Pamiętaj również, że prawdopodobnie możesz umieścić fragment pliku crontab w /etc/cron.d/

Jak widać, w tym środowisku nie ma nic szczególnego. Przynajmniej na Debianie / Ubuntu wszystko działa jako konto root.

Kiedy piszę skrypty Crona na samym początku skryptu, zawsze ustawiam PATH i inne zmienne środowiskowe, których będę używać, więc mogę być pewien, że będzie działać poprawnie w każdym środowisku.

Zoredache
źródło
6

Zwykły plik crontab dla całego systemu to plik crontab określonego użytkownika, który ma pole nazwy użytkownika używane przez /etc/crontab.

Używanie skryptów w /etc/cron.*(co godzinę, codziennie, co tydzień, co miesiąc) jest czystszym i łatwiejszym sposobem (zapobiega typowym błędom składniowym) konfigurowania crontab dla rootużytkownika i jest to obsługiwane przez run-partsktóre uruchamiają skrypty lub programy w katalogu. Wszystkie te reguły są domyślnie zdefiniowane w ogólnosystemowym crontabie ( /etc/crontab), więc jest to to samo.

Gdy obsługiwane są zadania cron run-parts, łatwiej je debugować, ponieważ można po prostu przetestować, które skrypty byłyby dokładnie uruchomione (bez ich uruchamiania) przez:

sudo run-parts --report --test /etc/cron.daily
kenorb
źródło
3

Moje pierwsze dzikie przypuszczenie to sprawdzenie zmiennej HOME.

W moim systemie Centos man 5 crontab mówi:

Kilka zmiennych środowiskowych jest konfigurowanych automatycznie przez demona cron (8). SHELL jest ustawiony na / bin / sh, a LOGNAME i HOME są ustawiane z wiersza / etc / passwd właściciela crontab.

Więc jeśli nie określiłeś inaczej, crontab root'a użyje / root dla HOME. Ale w / etc / crontab (czyli tam, gdzie /etc/cron.hourly jest uruchamiany przez części uruchomieniowe), HOME jest ustawione na / (i SHELL na / bin / bash zamiast / bin / sh).

Nie wiem o svnsync, ale subversion używa katalogu ˜ / .subversion /, więc to może zależeć od HOME.

Marie Fischer
źródło
3

W moim systemie RHEL 5.1 zmienna środowiskowa PATH jest ustawiana z / etc / crontab. Wszystko na górze to rzeczy wprowadzane do środowiska.

Jeśli zrestartujesz crona, to przy pierwszym uruchomieniu (jeśli z /etc/crontablub /var/spool/cron/$USER) zanotuje to w / var / log / cron. W przeciwnym razie zauważy tylko, że cron.hourly pobiegł

Mój crontab jest ustawiony na następujące:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Co możesz zrobić, umieść coś w następujący sposób w /etc/cron.hourly:

env > /tmp/cron.env

Następnie sprawdź plik, gdy się pojawi, albo zmodyfikuj skrypt (jeśli możesz), aby poprawnie ustawić środowisko, lub napisz krótki skrypt otoki, który wywoła twoja crontab.

Kevin M.
źródło
2

/var/log/messages (lub odpowiednik Twojej dystrybucji) powinien powiedzieć ci, jakie polecenie zostało uruchomione, kiedy i jako który użytkownik.

Dan Carley
źródło
2

Nigdy nie zakładaj, że coś jest w środowisku. Zawsze koduj obronnie. Masz cały plik, w którym możesz umieścić dowolne środowisko, w którym chcesz ustawić. Użyj tego.

Rory
źródło
2

Niewiele więcej przenośności, ostatnim razem, gdy sprawdzałem (w Debianie), zaleca się wkładanie rzeczy do cron.hourly (i innych), a nie bezpośrednio do crontab, jeśli chcesz stworzyć pakiet z twoimi rzeczami.

Johan
źródło