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.
Odpowiedzi:
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.
źródło
W systemie Debian / Ubuntu cron.daily | weekly | montly jest uruchamiany z głównego crontab.
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.
źródło
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 dlaroot
użytkownika i jest to obsługiwane przezrun-parts
któ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:źródło
Moje pierwsze dzikie przypuszczenie to sprawdzenie zmiennej HOME.
W moim systemie Centos man 5 crontab mówi:
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.
źródło
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/crontab
lub/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:
Co możesz zrobić, umieść coś w następujący sposób w /etc/cron.hourly:
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.
źródło
/var/log/messages
(lub odpowiednik Twojej dystrybucji) powinien powiedzieć ci, jakie polecenie zostało uruchomione, kiedy i jako który użytkownik.źródło
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.
źródło
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.
źródło