Dlaczego mój crontab się nie uruchomił?

29

Kiedyś crontab -edodawałem następujący wiersz do mojego crontab:

* * * * * echo hi >> /home/myusername/test

Jednak nie widzę, aby plik testowy został zapisany. Czy to jest problem z uprawnieniami, czy crontab nie działa poprawnie?

Widzę, że proces cron jest uruchomiony. Jak mogę to debugować?

Edycja - Zapytaj Ubuntu ma fajne pytanie o crontab , niestety to mi nie pomaga.

Edycja 2 - Hmm, wygląda na to, że mój plik testowy ma 214 linii, co oznacza, że ​​przez ostatnie 214 minut był zapisywany co minutę. Nie jestem pewien, na czym polegał problem, ale najwyraźniej zniknął.

ripper234
źródło

Odpowiedzi:

23

Istnieją implementacje cron(nie wszystkie, i nie pamiętam, która z nich, ale spotkałem jedną pod Linuksem), które sprawdzają dostępność zaktualizowanych plików crontab co minutę i nie rozważają nowych wpisów do następnej minuty . Dlatego crontab może zająć do dwóch minut po raz pierwszy. To może być to, co zaobserwowałeś.

Gilles
źródło
1
Chyba Solaris, a może wczesny Solaris. Mam w zwyczaju uruchamianie wpisu crona 3-5 minut w przyszłości, kiedy testuję skrypt z wpisu crontab, ponieważ takie zachowanie mnie cały czas oszukiwało.
Bruce Ediger,
fcronrobi to też.
phunehehe
Co jeśli procedura sprawdzania kosztuje więcej niż kilka minut? Będą cronjoby, które powinny zostać uruchomione podczas tego długiego „sprawdzania”, które nie zostały uruchomione.
ospider
@ospider Czek zajmuje tylko ułamek sekundy.
Gilles
28

Czy dodałeś pustą linię po cronjob ?

gelraen
źródło
Po mojej koleżance jest pusta linia.
ripper234 17.03.11
4
Nie pusta linia, ale nowa linia na końcu ostatniej linii. Plik tekstowy powinien składać się z sekwencji wierszy zakończonych znakiem nowej linii, więc niepusty plik tekstowy kończy się znakiem nowej linii. Niektóre narzędzia nie przetwarzają niczego po ostatniej nowej linii w pliku.
Gilles
1
Jest to kwestia terminów, „znak nowej linii” oznacza „po tym znaku rozpoczyna nowy wiersz tekstu”. Zatem 0 bajtów między ostatnią nową linią a EOF można również uznać za pustą linię („linię, która zawiera 0 znaków”)
gelraen
10

Miałem ten sam problem - działający crontab nagle się zatrzymał po dodaniu nowego wpisu na końcu. Okazało się, że zapomniałem umieścić nową linię po tej ostatniej linii.

Dowiedziałem się, wydając polecenie

cat /var/log/syslog | grep crontab

i wynik pokazał problem:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

Dodanie nowej linii i zapisanie rozwiązało problem.

uniomni
źródło
5

Wygląda na to, że to jest naprawione. Następnym razem spróbuj także zarejestrować STDERR. Następujące dane będą logować się tylko do STDOUT, nie STDERR:

* * * * * echo hi >> /home/myusername/test

Upewnij się, że istnieje również wyraźna klauzula dla STDERR. W przeciwnym razie STDERR może zostać wysłany do użytkownika za pośrednictwem wiadomości e-mail (przy założeniu, że e-mail działa) lub w ogóle nie może pójść, w zależności od konfiguracji Crona.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

Moje preferencje to wysłać wyjście cronjob do syslog. W ten sposób korzystam z dowolnej istniejącej infrastruktury syslog (scentralizowane syslogs, Splunk, rotacja logów już obsługiwane, łatwo porównywać wiadomości w / var / log / messages i / var / log / cronjob itp.), I nie jestem spamowanie sysadminów (mnie) niepotrzebnymi wiadomościami e-mail.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob
Stefan Lasiewski
źródło
2

Problem ze mną polegał na tym, że skrypt nie był wykonywalny. Miałem konfigurację crontab -e w ten sposób

* * * * * /bin/my-script.sh

A skrypt myscript nie był wykonywalny, więc uruchomiłem

chmod +x my-script.sh

Natychmiast zacząłem widzieć wynik zgodnie z oczekiwaniami.

santiago arizti
źródło
1

Twoja linia cron działa dobrze na moim komputerze, kiedy zmieniam myusernaena phunehehe. Istnieje kilka sposobów, aby dowiedzieć się, co jest nie tak z twoim systemem.

Cron zwykle wysyła pocztę do użytkownika, gdy coś jest nie tak. Jeśli zobaczysz komunikat „Masz pocztę”, użyj klienta pocztowego, aby sprawdzić skrzynkę odbiorczą . Lub sprawdź w swoim katalogu domowym, może tam być nazwany plik dead.letter.

Możesz sprawdzić /var/log/wpisy dotyczące crona. Na moim komputerze plik dziennika znajduje się w /var/log/cron/current(wymaga dostępu do konta root).

Jeśli masz dostęp do roota, możesz zatrzymać demona cron i uruchomić go w trybie debugowania. Na przykład użyłbym (zmień fcronnazwę twojego demona):

killall fcron
fcron --foreground --debug
phunehehe
źródło
Jak znaleźć nazwę mojego demona?
ripper234
@ ripper234 użyj ps -ef | grep croni powinieneś zobaczyć linię dla swojego crona. Sprawdź stronę podręcznika cron, aby zobaczyć flagę debugowania. Prawdopodobnie używasz Vixie Cron , w takim przypadku flaga debugowania to -x. Zabij proces crona i uruchom go ponownie z dodatkową flagą.
phunehehe
Sprawdź także / var / log / syslog. W moim przypadku pojawiły się ostrzeżenia, że ​​plik cron można zapisać w grupie.
phyzome 10.03.18
1

Najprawdopodobniej, gdy cron zawiedzie, generuje wiadomość e-mail do identyfikatora użytkownika zadania cron na tym komputerze. Jeśli nie masz MTA działającego na twoim komputerze lub nie czytasz ani nie przekazujesz tej poczty gdzie indziej, nie zobaczysz tej wiadomości, nawet jeśli MTA działa.

Dobrym sposobem na uzyskanie błędów crontab za pośrednictwem poczty jest sprawienie, aby twój crontab wyglądał tak:

MAILTO="[email protected]"
* * * * * echo hi >> /home/myusernae/test

Oczywiście używaj swojego adresu e-mail zamiast [email protected]. To mówi cronowi, aby wysyłał błędy na Twój adres e-mail, a nie na konto lokalne. Jest to szczególnie przydatne, jeśli masz plik crontab root (lub fragment crontab w /etc/cron.d), który chcesz po prostu wysłać do Ciebie, możesz uniknąć spamowania skrzynki pocztowej lub adresu przekierowania roota.

jsbillings
źródło
Nie wiem, czy w systemie jest skonfigurowany serwer SMTP / serwer poczty wychodzącej. Szanse są takie, że nie.
ripper234
1

Sądzę, że jednym z powodów może być to, że katalog / home / jest zaszyfrowany, a kiedy użytkownik jest wylogowany, cron nie może nic zrobić w tym katalogu.

patrz: https://stackoverflow.com/a/40354269/1279002

theINtoy
źródło