Próbowałem skonfigurować zadanie root cron do uruchamiania skryptu Bash jako root, aby uruchamiał się z minutą 7,37, co godzinę, każdego dnia miesiąca, każdego miesiąca. Ten skrypt znajduje się w /usr/bin
nazwie i nazywa tunlrupdate.sh
. Aktualizuje DNS Tunlr.
$ ls -l /usr/bin/tunlrupdate.sh
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh
Ten skrypt Bash jest dostępny tutaj .
Po wywołaniu skrypt zapisuje, co dzieje się w logu znajdującym się w /var/log/tunlr.log
Aby dodać to zadanie root crona, użyłem standardu dla crontab roota
sudo crontab -e
I wstawiłem te 2 linie na końcu. Oczekuję, że cron uruchomi skrypt jako root.
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh
Późniejsze polecenie sudo crontab -l
potwierdziło, że zadanie cron zostało wstawione.
Zrestartowałem Ubuntu i sprawdzałem w pliku dziennika, czy zadanie cron zostało poprawnie uruchomione. Jednak w pliku dziennika nie ma nic, /var/log/tunlr.log
co oznacza, że zadanie nigdy nie zostało pomyślnie uruchomione.
Sprawdziłem, czy uruchamiam skrypt z wiersza poleceń
sudo /usr/bin/tunlrupdate.sh
następnie plik dziennika jest odpowiednio aktualizowany.
Dlaczego to zadanie cron nie działa zgodnie z planem w moim systemie?
AKTUALIZACJA 1: Wszystkie dotychczas zaproponowane rozwiązania nie działają. Dziękuję Olli za interfejs CLI do wyświetlenia dziennika systemu sudo grep CRON /var/log/syslog
. Jednak dostałem błąd CRON
CRON[13092]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
z sugerowaną ŚCIEŻKĄ = wstawienie i użycie ścieżki bezwzględnej z katalogu głównego dla funkcji w skrypcie lub bez sugerowanych rozwiązań tutaj. Nadal pojawia się ten błąd.
Po kilku poszukiwaniach wskazałem błąd w pliku, /usr/lib/php5/maxlifetime
jak wyjaśniono tutaj :Change #!/bin/sh -e --> #!/bin/sh -x
Następnie wyświetlam dziennik błędów CRON w moim systemie
sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)
Nadal nie uruchamiam skryptu bash. Tym razem w dzienniku nie ma błędu. Aby uzyskać pewność, że nie była to treść skryptu, zredukowałem skrypt do następujących 3 wierszy:
#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE
Nadal nie dostaję pracy crona. W pliku dziennika nic nie jest zapisane. Więc może nawet pusty skrypt nie będzie działał w cronie? Nie rozumiem Wiem, że próbuję skryptu zredukowanego do tych 2 wierszy:
#!/bin/bash
exit 0
I wciąż ten sam dziennik błędów. Skrypt crona nie przechodzi ...
Odpowiedzi:
Jeśli chcesz uruchomić skrypt jako zwykły użytkownik :
I dodaj wiersz:
Jeśli chcesz uruchomić skrypt jako root :
I dodaj tę samą linię:
źródło
sudo crontab -e
zamiastcrontab -e
). Lub coś innego, w każdym razie to działaWreszcie działające rozwiązanie. W syslogu widziałem powtarzające się i intrygujące:
To brzmi jak root nie został rozpoznany jako cmd. Jak już użyłem crona root'a za pomocą
$ sudo /usr/bin/tunlrupdate.sh
. Następnie spróbowałem z oryginalnym skryptem (poprawionym pod kątem błędu w dacie UNIX cmd:% m, który jest miesiącem był używany przez minuty, co jest% M), następującą (która usuwa root z linii cron):To okazało się ostatecznym rozwiązaniem. [Chociaż znalazłem mnóstwo literatury stwierdzającej błędną linię z pierwiastkiem w linii crona. To był błąd].
źródło
crontab
poleceniem (z wyjątkiem plików crontab pod/etc
)./etc/crontab
(crontab dla całego systemu). Używającsudo crontab -e
pracujesz z/var/spool/cron/crontabs
Jednym z „problemów” z cronem jest brak zmiennych środowiskowych (z oczywistych względów bezpieczeństwa). Prawdopodobnie brakuje ci PATH i HOME. Możesz zdefiniować je w skrypcie bezpośrednio lub w pliku crontab.
Będziesz musiał testować, aż wszystkie niezbędne zmienne zostaną zdefiniowane zgodnie z wymaganiami skryptu.
źródło
/etc/crontab
pliku i wkleiłem je do,sudo crontab -e
a polecenie uruchomiło się jako root bez problemu. Dziękuję Ci!Komunikaty o błędach Cron są zazwyczaj - domyślnie - wysyłane pocztą e-mail. Możesz sprawdzić, czy jest e-mail do rootowania
sudo mail
, lub po prostu sprawdzając zawartość/var/mail/root
npsudo less /var/mail/root
.Jeśli wiadomości e-mail nie pomagają, sprawdź również
/var/log/syslog
:Jak już powiedziała Alexis Wilke, cron ma inny mechanizm ustawiania zmiennych środowiskowych.
Twój skrypt potrzebuje
do crontab.
HOME
nie powinno być konieczne. Powinieneś używać ścieżek bezwzględnych w swoich skryptach, np./bin/date
Zamiastdate
. Możesz znaleźć odpowiednie ścieżki dla każdego polecenia za pomocąwhich command_name
npźródło
/var/mail/root
. Możesz to naprawić lub spróbowaćPATH=...
Możesz dodać tę linię do skryptu. Więc po sprawdzeniu dzienników cron i sprawdzeniu, czy zadanie zostało wykonane, możesz dostać taką samą ścieżkę $ crontabs.
Prawdopodobnie najlepszą rzeczą, jaką możesz zrobić, aby zdiagnozować problemy w skryptach cron, jest pobranie wszystkich zmiennych środowiskowych SO za pomocą komendy env w skrypcie. Więc po prostu dodaj tę linię do skryptu. Następnie możesz przeanalizować dane wyjściowe
allEvnVars.txt
Inną sztuczką jest skierowanie wyjścia skryptu do jakiegoś miejsca. Dodawanie
/root/log.log
. W ten sposób wszystkie dane wyjściowe skryptu zostaną zachowane/root/log.log
Ponadto można zaplanować uruchamianie skryptu co minutę, aby ułatwić testy i kontrole.
źródło