To jest kanoniczne pytanie dotyczące używania cron i crontab.
Zostałeś skierowany tutaj, ponieważ społeczność jest dość pewna, że odpowiedź na twoje pytanie można znaleźć poniżej. Jeśli poniżej nie znajdziesz odpowiedzi na twoje pytanie, odpowiedzi pomogą Ci zebrać informacje, które pomogą społeczności. Informacje te należy edytować w pierwotnym pytaniu.
Odpowiedź na „ Dlaczego mój crontab nie działa i jak mogę go rozwiązać? ”można zobaczyć poniżej. Dotyczy to cron
systemu z podświetlonym crontabem.
Odpowiedzi:
Jak naprawić wszystkie problemy / problemy związane z plikiem crontab (Linux)
Po pierwsze, podstawowa terminologia:
Następnie edukacja o cronie:
Każdy użytkownik w systemie może mieć własny plik crontab. Lokalizacja plików root i crontab użytkownika zależy od systemu, ale ogólnie znajduje się poniżej
/var/spool/cron
.Istnieje plik systemowy
/etc/crontab
,/etc/cron.d
katalog może zawierać fragmenty crontab, które są również odczytywane i uruchamiane przez cron. Niektóre dystrybucje Linuksa (np. Red Hat) również mają/etc/cron.{hourly,daily,weekly,monthly}
katalogi, skrypty, które będą wykonywane co godzinę / dzień / tydzień / miesiąc, z uprawnieniami roota.root może zawsze używać polecenia crontab; zwykli użytkownicy mogą, ale nie muszą, uzyskać dostęp. Kiedy edytujesz plik crontab za pomocą polecenia
crontab -e
i zapisujesz go, crond sprawdza, czy jest poprawny, ale nie gwarantuje, że plik crontab jest poprawnie utworzony. Istnieje plik o nazwie,cron.deny
który określa, którzy użytkownicy nie mogą używać crona. Lokalizacjacron.deny
pliku zależy od systemu i można go usunąć, co pozwoli wszystkim użytkownikom korzystać z crona.Jeśli komputer nie jest włączony lub demon crond nie działa, a data / godzina uruchomienia komendy minęła, crond nie nadrabia zaległości i nie wykonuje zapytań.
szczegóły crontab, jak sformułować polecenie:
Polecenie crontab jest reprezentowane przez pojedynczy wiersz. Nie można użyć
\
do rozszerzenia polecenia na wiele wierszy. Znak hash (#
) reprezentuje komentarz, co oznacza, że cron w tym wierszu jest ignorowany. Wiodące białe znaki i puste linie są ignorowane.Bądź BARDZO ostrożny podczas używania
%
znaku procentu ( ) w swoim poleceniu. O ile nie są one uciekane\%
, są konwertowane na nowe linie, a wszystko po pierwszym nie-ucieczce%
jest przekazywane do polecenia na standardowym wejściu.Istnieją dwa formaty plików crontab:
Crontabs użytkownika
System szeroki
/etc/crontab
i/etc/cron.d
fragmentyZauważ, że ta ostatnia wymaga nazwy użytkownika. Polecenie zostanie uruchomione jako nazwany użytkownik.
Pierwsze 5 pól wiersza reprezentuje czas (s), kiedy polecenie powinno zostać uruchomione. W specyfikacji czasu można używać liczb lub, w stosownych przypadkach, nazw dni / miesięcy.
,
) jest używany do określenia listy, np. 1,4,6,8, co oznacza uruchomienie z 1,4,6,8.-
) i mogą być łączone z listami, np. 1-3,9-12, co oznacza od 1 do 3, a następnie od 9 do 12./
Postać może być wykorzystane do wprowadzenia np krok 2/5 co oznacza, począwszy od 2, a następnie co 5 (2,7,12,17,22 ...). Nie zawijają się do końca.*
) w polu oznacza cały zakres dla tego pola (np.0-59
Dla pola minut).*/2
Oznacza, że zaczyna się od minimum dla odpowiedniego pola, a następnie co 2 np. 0 przez minuty (0,2 ... 58), 1 przez miesiące (1,3 ... 11) itd.Debugowanie poleceń crona
Sprawdż poczte!
Domyślnie cron wyśle wszelkie dane wyjściowe polecenia do użytkownika, który uruchamia polecenie jako. Jeśli nie ma danych wyjściowych, nie będzie żadnej poczty. Jeśli chcesz, aby cron wysyłał pocztę na inne konto, możesz ustawić zmienną środowiskową MAILTO w pliku crontab, np.
Uchwyć wyjście samodzielnie
Możesz przekierować stdout i stderr do pliku. Dokładna składnia do przechwytywania danych wyjściowych może się różnić w zależności od używanego crona powłoki. Oto dwa przykłady, które zapisują wszystkie dane wyjściowe do pliku w
/tmp/mycommand.log
:Spójrz na dzienniki
Cron rejestruje swoje działania za pomocą syslog, który (w zależności od konfiguracji) często przechodzi do
/var/log/cron
lub/var/log/syslog
.W razie potrzeby można filtrować instrukcje cron za pomocą np
Teraz, kiedy omówiliśmy podstawy crona, gdzie są pliki i jak z nich korzystać, spójrzmy na niektóre typowe problemy.
Sprawdź, czy cron działa
Jeśli cron nie działa, twoje polecenia nie zostaną zaplanowane ...
powinienem dać ci coś takiego
lub
Jeśli nie, uruchom go ponownie
lub
Mogą istnieć inne metody; użyj tego, co zapewnia twoja dystrybucja.
cron uruchamia polecenie w ograniczonym środowisku.
Dostępne zmienne środowiskowe będą prawdopodobnie bardzo ograniczone. Zwykle, dostaniesz tylko kilka zmiennych zdefiniowanych, jak
$LOGNAME
,$HOME
i$PATH
.Na szczególną uwagę zasługuje
PATH
ograniczenie/bin:/usr/bin
. Zdecydowana większość problemów „mój skrypt cron nie działa” spowodowana jest tą restrykcyjną ścieżką . Jeśli twoje polecenie znajduje się w innym miejscu, możesz rozwiązać to na kilka sposobów:Podaj pełną ścieżkę do swojego polecenia.
Podaj odpowiednią ŚCIEŻKĘ w pliku crontab
Jeśli twoje polecenie wymaga innych zmiennych środowiskowych, możesz je również zdefiniować w pliku crontab.
cron wykonuje polecenie za pomocą cwd == $ HOME
Niezależnie od tego, gdzie program, który wykonujesz, znajduje się w systemie plików, bieżącym katalogiem roboczym programu po uruchomieniu crona będzie katalog domowy użytkownika . Jeśli uzyskujesz dostęp do plików w swoim programie, musisz wziąć to pod uwagę, jeśli używasz ścieżek względnych lub (najlepiej) po prostu korzystasz z pełnych ścieżek wszędzie i oszczędzasz wszystkim wiele zamieszania.
Ostatnie polecenie w moim crontabie nie działa
Cron zasadniczo wymaga, aby polecenia były kończone w nowej linii. Edytuj swój crontab; przejdź do końca wiersza zawierającego ostatnie polecenie i wstaw nowy wiersz (naciśnij enter).
Sprawdź format crontab
Nie możesz użyć crontab sformatowanego przez użytkownika crontab dla / etc / crontab lub fragmentów w /etc/cron.d i vice versa. Crontab sformatowany przez użytkownika nie zawiera nazwy użytkownika w szóstej pozycji wiersza, a crontab sformatowany przez system zawiera nazwę użytkownika i uruchamia polecenie jako ten użytkownik.
Umieszczam plik w /etc/cron.{hourly,daily,weekly,monthly} i nie działa
#!/bin/sh
na górze)Błędy związane z datą Cron
Jeśli twoja data została ostatnio zmieniona przez użytkownika lub aktualizację systemu, strefę czasową lub inną, wtedy crontab zacznie zachowywać się nieprawidłowo i zawierać dziwne błędy, czasem działające, a czasem nie. Jest to próba crontab, by spróbować „robić, co chcesz”, gdy czas zmienia się od spodu. Pole „minut” stanie się nieskuteczne po zmianie godziny. W tym scenariuszu akceptowane są tylko gwiazdki. Uruchom ponownie crona i spróbuj ponownie bez łączenia się z Internetem (aby data nie miała możliwości zresetowania do jednego z serwerów czasu).
Znaki procentu znowu
Aby podkreślić porady dotyczące znaków procentowych, oto przykład tego, co robi cron z nimi:
utworzy plik ~ / cron.out zawierający 3 linie
Jest to szczególnie uciążliwe podczas używania
date
polecenia. Pamiętaj, aby uniknąć znaków procentuźródło
... /path/to/your/command >/tmp/mycommand.log 2>&1
sudo apt-get install postfix
Debian Linux i jego pochodne (Ubuntu, Mint itp.) Mają pewne cechy szczególne, które mogą uniemożliwić wykonanie zadań crona; w szczególności pliki w
/etc/cron.d
,/etc/cron.{hourly,daily,weekly,monthly}
musi:Ten ostatni rani regularnie niczego niepodejrzewających użytkowników; w szczególności każdy skrypt w jednym z tych folderów nazwanych
whatever.sh
,mycron.py
,testfile.pl
, itd. będzie nie być wykonywane, kiedykolwiek.Z mojego doświadczenia wynika, że ten konkretny punkt był zdecydowanie najczęstszym powodem niewykonywania cronjobu na Debianie i instrumentach pochodnych.
Aby
man cron
uzyskać więcej informacji, w razie potrzeby.źródło
Jeśli Twoje cronjobs przestaną działać, sprawdź, czy hasło nie wygasło. Od tego momentu wszystkie zadania cron przestają działać.
Pojawią się wiadomości
/var/log/messages
podobne do tych poniżej, które pokazują problemy z uwierzytelnianiem użytkownika:źródło
sudo -u root passwd
Niezbyt częste i nieregularne harmonogramy
Cron jest uważany za bardzo prosty harmonogram, a składnia nie pozwala administratorowi na sformułowanie nieco rzadszych harmonogramów.
Rozważ następujące zadanie, które zwykle tłumaczy się jako „uruchamiane
command
co 5 minut” :przeciw:
który nie zawsze działa
command
co 7 minut .Pamiętaj, że /postać może zostać użyta do wprowadzenia kroku, ale kroki nie zawijają się poza koniec serii, np.
*/7
Które pasują co 7 minut od minuty,0-59
tj. 0,7,14,21,28,35,42,49, 56, lecz między jedną godzinę i następnym będzie tylko 4 minut pomiędzy partiami , gdy00:56
nowy cykl rozpoczyna się01:00
,01:07
itd. (i porcje nie będą działały na01:03
,01:10
,01:17
itd.).Co zamiast tego zrobić?
Utwórz wiele partii
Zamiast pojedynczego zadania cron, utwórz wiele partii, które razem dają pożądany harmonogram.
Na przykład, aby uruchomić partię co 40 minut (00:00, 00:40, 01:20, 02:00 itd.) Utwórz dwie partie, jedną, która działa dwa razy w parzyste godziny, a druga, która działa tylko w nieparzystych godzinach:
Rzuć partie rzadziej
Zamiast uruchamiać partię co 7 minut, co trudno rozkładać na wiele partii, po prostu uruchamiaj ją co 10 minut.
Częściej uruchamiaj partie (ale zapobiegaj jednoczesnemu uruchamianiu wielu partii)
Wiele nieparzystych harmonogramów ewoluuje, ponieważ środowiska wykonawcze partii zwiększają się / zmieniają, a następnie partie są planowane z odrobiną dodatkowego marginesu bezpieczeństwa, aby zapobiec nakładaniu się i uruchamianiu kolejnych serii tej samej partii.
Zamiast tego, pomyśl inaczej i stwórz cronjob, który z wdziękiem zawiedzie, gdy poprzednie uruchomienie jeszcze się nie zakończyło, ale będzie działać inaczej. Zobacz te pytania i odpowiedzi :
To prawie natychmiast rozpocznie nowy przebieg po zakończeniu poprzedniego uruchomienia / usr / local / bin / Frequent_cron_job.
Zacznij partie częściej (ale z wdziękiem wychodź, gdy warunki nie są odpowiednie)
Ponieważ składnia cron jest ograniczona, możesz zdecydować o umieszczeniu bardziej złożonych warunków i logiki w samym zadaniu wsadowym (lub w skrypcie opakowującym wokół istniejącego zadania wsadowego). Dzięki temu możesz wykorzystać zaawansowane możliwości swoich ulubionych języków skryptowych, komentować kod i zapobiegać trudnym do odczytania konstrukcjom w samym wpisie crontab.
W bashu
seven-minute-job
wyglądałoby to mniej więcej tak:Które możesz następnie bezpiecznie (próbować) uruchomić co minutę:
Odmienny, ale podobny problem by zaplanować partii do uruchomienia w pierwszy poniedziałek każdego miesiąca (lub w drugą środę) itd Wystarczy zaplanować partii do uruchomienia w każdy poniedziałek i wyjście gdy data nie jest ani między 1 st lub 7 th i dzień tygodnia nie jest poniedziałkiem.
Które możesz następnie bezpiecznie (próbować) uruchomić w każdy poniedziałek:
Nie używaj crona
Jeśli Twoje potrzeby są złożone, możesz rozważyć użycie bardziej zaawansowanego produktu, który jest zaprojektowany do uruchamiania złożonych harmonogramów (rozproszonych na wielu serwerach) i który obsługuje wyzwalacze, zależności zadań, obsługę błędów, ponawianie prób i monitorowanie itp. Żargonem branżowym byłoby „przedsiębiorstwo „ planowanie zadań i / lub„ automatyzacja obciążenia ”.
źródło
Specyficzne dla PHP
Jeśli masz jakieś zadanie crona, takie jak:
A w przypadku błędów oczekuj, że zostaną do Ciebie wysłane, ale nie robią tego - sprawdź to.
PHP domyślnie nie wysyła błędów do STDOUT. @ patrz https://bugs.php.net/bug.php?id=22839
Aby to naprawić, dodaj w pliku cli`s php.ini lub w linii (lub w bashu dla PHP):
1. ustawienie pozwoli ci mieć takie fatale jak „Ups pamięci”, a drugie - przekieruje ich wszystkich do STDERR. Dopiero po tym, jak będziesz mógł spać spokojnie, wszystko zostanie wysłane na pocztę użytkownika root, a nie tylko zalogowane.
źródło
Dodawanie moją odpowiedź stąd pod kątem kompletności i dodanie innego potencjalnie pomocne zasobu:
cron
Użytkownik ma inny$PATH
niż zrobić:Częstym problemem, jaki użytkownicy stawiają przy
crontab
wpisach, jest to, że zapominają, żecron
działają w inny sposóbenvironment
niż jako zalogowani użytkownicy. Na przykład użytkownik tworzy program lub skrypt w swoim$HOME
katalogu i wprowadza następującą komendę, aby go uruchomić:Polecenie działa idealnie z jego wiersza poleceń. Następnie użytkownik dodaje to polecenie do swojego
crontab
, ale stwierdza, że to nie działa:Przyczyną niepowodzenia w tym przypadku jest
./
inna lokalizacja dlacron
użytkownika niż dla zalogowanego użytkownika. Oznacza to, żeenvironment
jest inaczej! ŚCIEŻKA jest częściąenvironment
i zwykle jest inna dlacron
użytkownika. Problem komplikuje to, żeenvironment
forcron
nie jest taki sam dla wszystkich dystrybucji * nix i istnieje wiele wersjicron
Prostym rozwiązaniem tego konkretnego problemu jest podanie
cron
użytkownikowi pełnej specyfikacji ścieżki wecrontab
wpisie:Jaki jest
cron
użytkownikenvironment
?W niektórych przypadkach możemy potrzebować poznać pełną
environment
specyfikacjęcron
w naszym systemie (lub możemy być po prostu ciekawi). Co jestenvironment
dlacron
użytkownika i czym różni się od naszego? Co więcej, może być konieczne poznanieenvironment
innegocron
użytkownika -root
na przykład ... z czego korzystaroot
użytkownik ? Jednym ze sposobów, aby się tego nauczyć, jest poproszenie o powiedzenie nam:environment
cron
cron
~/
) w następujący sposób (lub w wybranym edytorze):/home/you/envtst.sh.out
. Dane wyjściowe pokażą twoje aktualne środowisko, gdy$USER
jesteś zalogowany jako:crontab
do edycji:crontab
:ODPOWIEDŹ: Plik wyjściowy
/home/you/envtst.sh.out
będzie zawierał listęenvironment
dla „użytkownika root cron”. Gdy się o tym dowiesz, odpowiednio dostosuj swójcrontab
wpis.Nie mogę określić harmonogramu, którego potrzebuję we
crontab
wpisie:Wpis harmonogramu dla
crontab
jest oczywiście zdefiniowany wman crontab
, i powinieneś to przeczytać. Jednak czytanieman crontab
i rozumienie harmonogramu to dwie różne rzeczy. A próby i błędy w specyfikacji harmonogramu mogą stać się bardzo nużące. Na szczęście istnieje zasób, który może pomóc: guru crontab. . Wprowadź specyfikację harmonogramu, a objaśni harmonogram w prostym języku angielskim.Wreszcie, ryzykując zwolnieniem z jedną z innych odpowiedzi tutaj, nie daj się złapać w pułapkę myślenia, że jesteś ograniczony do jednego
crontab
wpisu, ponieważ masz jedno zadanie do zaplanowania. Możesz użyć tylecrontab
wpisów, ile potrzebujesz, aby uzyskać potrzebny harmonogram.źródło