Jak naprawić wszystkie problemy / problemy związane z plikiem crontab (Linux)
To jest wiki społeczności. Jeśli zauważysz coś nieprawidłowego w tej odpowiedzi lub masz dodatkowe informacje, edytuj je.
Po pierwsze, podstawowa terminologia:
- cron (8) to demon, który wykonuje zaplanowane polecenia.
- crontab (1) to program służący do modyfikacji plików crontab użytkownika (5).
- crontab (5) to plik na użytkownika, który zawiera instrukcje dla cron (8).
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. Lokalizacja cron.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
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
System szeroki /etc/crontab
i /etc/cron.d
fragmenty
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Zauważ, ż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.
- Pola są oddzielone spacjami lub tabulatorami.
- Przecinek (
,
) jest używany do określenia listy, np. 1,4,6,8, co oznacza uruchomienie z 1,4,6,8.
- Zakresy są określone za pomocą myślnika (
-
) 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.
- Gwiazdka (
*
) w polu oznacza cały zakres dla tego pola (np. 0-59
Dla pola minut).
- Zakresy i kroki można łączyć np.
*/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.
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
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
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
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
grep CRON /var/log/syslog
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 ...
ps -ef | grep cron | grep -v grep
powinienem dać ci coś takiego
root 1224 1 0 Nov16 ? 00:00:03 cron
lub
root 2018 1 0 Nov14 ? 00:00:06 crond
Jeśli nie, uruchom go ponownie
/sbin/service cron start
lub
/sbin/service crond start
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.
1 2 * * * /path/to/your/command
Podaj odpowiednią ŚCIEŻKĘ w pliku crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
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
- Sprawdź, czy nazwa pliku nie ma rozszerzenia, patrz części run
- Upewnij się, że plik ma uprawnienia do wykonywania.
- Poinformuj system, z czego korzystać podczas wykonywania skryptu (np. Umieść
#!/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:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
utworzy plik ~ / cron.out zawierający 3 linie
foo
bar
baz
Jest to szczególnie uciążliwe podczas używania date
polecenia. Pamiętaj, aby uniknąć znaków procentu
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"