GNU/Linux >> Znalost Linux >  >> Linux

CronJob neběží

WTF?! Můj cronjob neběží?!

Zde je průvodce kontrolním seznamem, jak ladit neběžící cronjob:

  1. Běží démon Cron?
  • Spusťte ps ax | grep cron a hledejte cron.
  • Debian:service cron start nebo service cron restart
  1. 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 s 2>>/tmp/errors
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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 k cron.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še more $MAIL pokud nemáte poštovního klienta). Pokud pošta není k dispozici, možná vyhledejte soubor s názvem dead.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!

  1. 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
  • 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
  • Připomenutí:po dokončení ladění deaktivujte úroveň protokolu
  1. 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

  1. crontab -l
    • Uvádí seznam všech úloh cronu uživatele.
  2. 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.
  3. 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:

  1. Konfigurační soubory Cron vložené do /etc/cron.d/ by neměly obsahovat tečku (.). Jinak to cron nepřečte.
  2. Pokud uživatel spouštějící váš příkaz není v /etc/shadow. Nebude povoleno plánovat cron.

Odkazy:

  1. http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
  2. https://help.ubuntu.com/community/CronHowto

Nakonec jsem našel řešení. Řešení je následující:-

  1. 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
    
  2. 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/


Linux
  1. Spuštění úlohy cronu na Linuxu každých šest hodin

  2. Příkaz Linux pro kontrolu, zda je spuštěn skript shellu nebo ne

  3. @reboot nefunguje v CRON

  1. cron občas neběží

  2. Vypište aktuálně spuštěnou kartu cron a zastavte ji

  3. připojit Linux NFS. rpc.statd neběží

  1. Jak používat cron na Linuxu

  2. .bash_profile není při spuštění Su?

  3. Úloha Cron zkontrolovat, zda skript PHP běží, pokud ne, pak spustit?