WTF?! Můj cronjob neběží?!
Zde je průvodce kontrolním seznamem, jak ladit neběžící cronjob:
- Běží démon Cron?
- Spusťte
ps ax | grep cron
a hledejte cron. - Debian:
service cron start
neboservice cron restart
- Funguje cron?
* * * * * /bin/echo "cron works" >> /tmp/file
- Správná syntaxe? Viz níže.
- Samozřejmě musíte mít přístup k zápisu do souboru, do kterého přesměrováváte výstup. Jedinečný název souboru v
/tmp
který aktuálně neexistuje, by měl být vždy zapisovatelný. - Pravděpodobně také přidejte
2>&1
zahrnout standardní chybu i standardní výstup nebo samostatně vypsat standardní chybu do jiného souboru s2>>/tmp/errors
- Funguje příkaz samostatně?
- Zkontrolujte, zda se ve skriptu nevyskytla chyba, a to tak, že na CLI spustíte nasucho
- Při testování příkazu otestujte jako uživatel, jehož crontab upravujete, což nemusí být vaše přihlašovací jméno nebo root
- Může cron spustit vaši úlohu?
- Zaškrtněte
/var/log/cron.log
nebo/var/log/messages
za chyby. - Ubuntu:
grep CRON /var/log/syslog
- Redhat:
/var/log/cron
- Zkontrolujte oprávnění
- Nastavte u příkazu příznak spustitelného souboru:
chmod +x /var/www/app/cron/do-stuff.php
- Pokud přesměrujete výstup svého příkazu do souboru, ověřte, zda máte oprávnění k zápisu do tohoto souboru/adresáře
- Zkontrolujte cesty
- Zkontrolujte řádek s třeskami / hashbangs
- Nespoléhejte se na proměnné prostředí jako
PATH
, protože jejich hodnota pravděpodobně nebude stejná pod cronem jako pod interaktivní relací. Viz Jak přimět CRON, aby volal správné PATH
- Během ladění nepotlačujte výstup
- Běžně se používá toto potlačení:
30 1 * * * command > /dev/null 2>&1
- Znovu povolte standardní výstup nebo standardní výstup chybové zprávy odstraněním
>/dev/null 2>&1
celkem; nebo možná přesměrujte do souboru v umístění, kde máte přístup pro zápis:>>cron.out 2>&1
připojí standardní výstup a standardní chybu kcron.out
v domovském adresáři volajícího uživatele. - Pokud nepřesměrujete výstup z
cron
úlohy, démon se vám pokusí poslat jakýkoli výstup nebo chybové zprávy e-mailem. Zkontrolujte si doručenou poštu (možná jednodušemore $MAIL
pokud nemáte poštovního klienta). Pokud pošta není k dispozici, možná vyhledejte soubor s názvemdead.letter
ve vašem domovském adresáři nebo záznamy v systémovém protokolu, které říkají, že výstup byl zahozen. Zejména v druhém případě pravděpodobně upravte úlohu tak, abyste přidali přesměrování do souboru, pak počkejte, až se úloha spustí, a prozkoumejte soubor protokolu, zda neobsahuje chybové zprávy nebo jinou užitečnou zpětnou vazbu. - Pokud se snažíte zjistit, proč něco selhalo, chybové zprávy se zobrazí v tomto souboru. Přečtěte si to a pochopte to.
Stále nefunguje? Jejda!
- Zvyšte úroveň ladění cron
- Debian
- v
/etc/default/cron
- nastavte
EXTRA_OPTS="-L 2"
service cron restart
tail -f /var/log/syslog
zobrazit provedené skripty
- v
- Ubuntu
- v
/etc/rsyslog.d/50-default.conf
- přidejte nebo okomentujte řádek
cron.* /var/log/cron.log
- znovu načtěte zapisovač
sudo /etc/init.d/rsyslog restart
- znovu spusťte cron
- otevřete
/var/log/cron.log
a vyhledejte podrobný chybový výstup
- v
- Připomenutí:po dokončení ladění deaktivujte úroveň protokolu
- Spusťte cron a znovu zkontrolujte soubory protokolu
Syntaxe Cronjob
# Minute Hour Day of Month Month Day of Week User Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * root /usr/bin/find
Tato syntaxe je pouze správně pro root
uživatel. Běžný uživatel crontab
syntaxe nemá Uživatel pole (běžní uživatelé nemají povoleno spouštět kód jako kterýkoli jiný uživatel);
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * /usr/bin/find
Příkazy Crontab
crontab -l
- Uvádí seznam všech úloh cronu uživatele.
crontab -e
, pro konkrétního uživatele:crontab -e -u agentsmith
- Zahájí relaci úprav vašeho souboru crontab.
- Když editor ukončíte, upravený crontab se automaticky nainstaluje.
crontab -r
- Odebere vaši položku crontab ze zařazovací služby cron, ale ne ze souboru crontab.
Chci přidat 2 body, které jsem se naučil:
- Konfigurační soubory Cron vložené do /etc/cron.d/ by neměly obsahovat tečku (.). Jinak to cron nepřečte.
- Pokud uživatel spouštějící váš příkaz není v /etc/shadow. Nebude povoleno plánovat cron.
Odkazy:
- http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
- https://help.ubuntu.com/community/CronHowto
Nakonec jsem našel řešení. Řešení je následující:-
-
Nikdy nepoužívejte relativní cestu ve skriptech pythonu, které se mají spouštět přes crontab. Místo toho jsem udělal něco takového:-
import os import sys import time, datetime CLASS_PATH = '/srv/www/live/mainapp/classes' SETTINGS_PATH = '/srv/www/live/foodtrade' sys.path.insert(0, CLASS_PATH) sys.path.insert(1,SETTINGS_PATH) import other_py_files
-
Nikdy nepotlačujte kód crontab, místo toho použijte poštovní server a zkontrolujte poštu pro uživatele. To poskytuje jasnější přehled o tom, co se děje.
Další důvod, proč crontab selže:Speciální zpracování %
postava.
Ze souboru příručky:
The entire command portion of the line, up to a newline or a
"%" character, will be executed by /bin/sh or by the shell specified
in the SHELL variable of the cronfile. A "%" character in the
command, unless escaped with a backslash (\), will be changed into
newline characters, and all data after the first % will be sent to
the command as standard input.
V mém konkrétním případě jsem používal date --date="7 days ago" "+%Y-%m-%d"
vytvořit parametry pro můj skript a tiše selhal. Konečně jsem zjistil, co se děje, když jsem zkontroloval syslog
a viděl jsem, že můj příkaz byl zkrácen na %
symbol. Musíte tomu uniknout takto:
date --date="7 days ago" "+\%Y-\%m-\%d"
Další podrobnosti naleznete zde:
http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/