De ce crontab script-uri nu sunt de lucru?

De multe ori, crontab script-uri nu sunt executate la termen, sau după cum era de așteptat. Există numeroase motive pentru asta:

  1. greșit crontab notație
  2. permisiuni problema
  3. variabile de mediu

Acest wiki a comunității își propune să agregate motivele de top pentru crontab` script-uri nu a fi executat așa cum era de așteptat. Scrie fiecare motiv într-un răspuns separat.

Vă rugăm să includeți un motiv pe răspuns - detalii despre ce se's nu a executat - și repara(es) pentru un singur motiv.

Vă rugăm să scrie numai cron-probleme specifice, de exemplu, comenzi care executa cum era de așteptat de la shell, dar executa în mod eronat de către cron.

Comentarii la întrebare (4)
Soluția

Mediu diferit

Cron trece un minim set de variabile de mediu la locurile de muncă. Pentru a vedea diferența, se adaugă un manechin loc de muncă de genul asta:

* * * * * env > /tmp/env.ieșire

Așteptați pentru /tmp/env.de ieșire să fie creat, apoi se scoate postul din nou. Acum compara conținutul a/tmp/env.ieșire cu producția de "mediu" a alerga în periodice terminal.

Un comun "prins" aici este "CALE" variabila de mediu fiind diferit. Poate cron script foloseste comanda somecommand a găsit într /opt/someApp/bin, care'am adăugat la "CALE" în /etc/mediu? cron ignoră "CALE" de la acel fișier, astfel încât runnningsomecommand de script-ul va eșua atunci când rula cu cron, dar locul de muncă atunci când a alerga într-un terminal. L's de remarcat faptul că variabilele din /etc/environment va fi trecut pe la locuri de muncă cron, nu doar variabilele cron special seturi în sine, cum ar fi "CALE".

Pentru a obține în jurul valorii de asta, trebuie doar să setați propria "CALE" variabilă în partea de sus a script-ul. E. g.

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

Unii preferă să folosească căi absolute pentru toate comenzile în loc. Nu recomand asta. Ia în considerare ce se întâmplă dacă doriți să executați scriptul pe un sistem diferit, și pe care sistemul de comandă este în/opt/someAppv2.2/binîn loc. Te'd trebuie să treacă prin tot scenariul înlocuirea/opt/someApp/bin " cu " /opt/someAppv2.2/bin` în loc de a face doar un mic edit la primul linia de script-ul.

Puteți seta, de asemenea, CALEA variabilă în fișierul crontab, care se va aplica la toate de locuri de muncă cron. E. g.

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root
Comentarii (22)

Topul meu te-am prins: Dacă uitați să adăugați o linie nouă de la sfârșitul anilor crontab de fișier. Cu alte cuvinte, fișierul crontab ar trebui să se termine cu o linie goală.

Mai jos este secțiunea relevantă în paginile man pentru această problemă (om crontab apoi treceți la final):

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)
Comentarii (12)

Cron daemon nu se execută. Chiar am dat-o în bară cu asta acum câteva luni.

Tip:

pgrep cron 

Dacă ai vedea nici un număr, atunci cron nu se execută. sudo /etc/init.d/cron start poate fi folosit pentru a porni cron.

EDIT: mai Degrabă decât invocarea scripturile de inițializare prin /etc/init.d, utilizați serviciul de utilitate, de ex.

sudo service cron start

EDIT: de Asemenea, ai putea folosi systemctl în moderne de Linux, de ex.

sudo systemctl start cron
Comentarii (4)

Scenariul nume de fișiere în cron.d/, cron.de zi cu zi/, cron.detalii/, etc., nu ar trebui să conțină punct (.), în caz contrar, executați-părți vor sări peste ele.

Vezi run-parts(8):

   If neither the --lsbsysinit option nor the --regex option is given then
   the names must consist entirely of upper and lower case  letters,  dig‐
   its, underscores, and hyphens.

   If  the  --lsbsysinit  option  is given, then the names must not end in
   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
   one  or more of the following namespaces: the LANANA-assigned namespace
   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
   (^[a-zA-Z0-9_-]+$).

Deci, dacă aveți un cron script backup.sh, analyze-logs.pl " în " cron.de zi cu zi/ director, ai'd cel mai bine pentru a elimina extensie de nume.

Comentarii (4)

În multe medii cron execută comenzile folosesc "sh", în timp ce mulți oameni presupun că va folosi bash.

Sugestii pentru a testa sau a remedia acest lucru pentru faptul că nu comandă:

  • Încercați să executați comanda " sh " pentru a vedea dacă acesta funcționează:

sh -c "mycommand"

  • Folie de comandă într-un bash subshell să asigurați-vă că va rula în bash:

bash -c "mybashcommand"

  • Spune-cron pentru a rula toate comenzile în bash prin stabilirea coajă de la partea de sus a crontab:

SHELL=/bin/bash

  • Dacă comanda este un script, asigurați-vă că scriptul conține o chestie:

!/bin/bash

Comentarii (5)

Am avut unele probleme cu zone de timp. Cron fost difuzate cu instalare proaspătă de fus orar. Soluția a fost de a reporni cron:

sudo service cron restart
Comentarii (2)

Calea absolută ar trebui să fie utilizate pentru script-uri:

De exemplu, /bin/grep ar trebui să fie folosit în loc de grep:

# m h  dom mon dow   command
0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors

În loc de:

# m h  dom mon dow   command
0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors

Acest lucru este deosebit de dificil, pentru că aceeași comandă va funcționa atunci când sunt executate de shell. Motivul este că cron nu au aceeași "CALE" variabila de mediu ca utilizator.

Comentarii (3)

Dacă crontab a o % simbol în ea, cron încearcă să-l interpreteze. Deci, dacă ați fost folosind orice comanda cu o % in ea (cum ar fi un format caietul de sarcini pentru a comanda data), va trebui să scape de ea.

Asta și alte chestii aici: http://www.pantz.org/software/cron/croninfo.html

Comentarii (2)

Cron este de asteptare un script care nu este executabil.

Prin rularea chmod +x /path/to/traista script-ul devine executabil, și ar trebui să rezolve această problemă.

Comentarii (2)

De asemenea, este posibil ca utilizatorul's a parolei a expirat. Chiar și rădăcină's parolă poate expira. Puteți tail-f /var/log/cron.log și veți vedea cron eșua cu parola a expirat. Puteți seta parola pentru a nu expira niciodata de a face acest lucru: passwd -x -1 <numele de utilizator>

În unele sisteme (Debian, Ubuntu) de logare pentru cron nu este activată în mod implicit. În /etc/rsyslog.conf sau /etc/rsyslog.d/50-default.conf linia:

# cron.*                          /var/log/cron.log

ar trebui să fie editate (sudo nano /etc/rsyslog.conf) necomentate la:

cron.*                          /var/log/cron.log

După aceea, aveți nevoie pentru a reporni rsyslog prin

/etc/init.d/rsyslog restart

sau

service rsyslog restart 

Sursa: Enable crontab logare în Debian Linux

În unele sisteme (Ubuntu) separate fișierul jurnal pentru cron nu este activată implicit, dar cron legate busteni apar in syslog. Se poate folosi

cat /var/log/syslog | grep cron -i

pentru a vizualiza cron legate de mesaje.

Comentarii (1)

Dacă cronjob invocă GUI-apps, trebuie să le spui ce AFIȘARE ar trebui să folosească.

Exemplu: Firefox lansa cu cron.

Script-ul dvs. ar trebui să conțină export DISPLAY=:0` undeva.

Comentarii (2)

Permisiuni de probleme sunt destul de comune, am'm tem.

Rețineți că o soluție comună este de a executa tot ceea ce folosind rădăcină's crontab, care, uneori, este o Idee Foarte Proastă. Setare permisiuni adecvate este cu siguranta o mare parte trecute cu vederea problema.

Comentarii (1)

Nesigur cron masă permisiunea

Un tabel cron este rejected în cazul în care permisiunea este nesigur

sudo service cron restart
grep -i cron /var/log/syslog|tail -2
2013-02-05T03:47:49.283841+01:00 ubuntu cron[49906]: (user) INSECURE MODE (mode 0600 expected) (crontabs/user)

Problema este rezolvată cu

# correct permission
sudo chmod 600 /var/spool/cron/crontabs/user
# signal crond to reload the file
sudo touch /var/spool/cron/crontabs
Comentarii (1)

Script-ul este locul de amplasare-sensibile. Acest lucru este legat întotdeauna folosind căi absolute într-un script, dar nu chiar la fel. Dvs. de locuri de muncă cron ar putea avea nevoie de a cd la un anumit director înainte de a rula, de exemplu, o greblă sarcina pe Șine aplicație poate fi necesar să fie în aplicație root pentru Rake-ul pentru a găsi corect sarcina, să nu mai vorbim corespunzătoare configurare a bazei de date, etc.

Deci, un crontab de intrare

23 3 * * * /usr/bin/rake db:session_purge RAILS_ENV=producție

ar fi mai bine ca

23 3 * * * cd /var/www/producție/curent && /usr/bin/rake db:session_purge RAILS_ENV=producția

Sau, pentru a menține crontab intrare mai simplă și mai puțin fragile:

23 3 * * * /acasă/<utilizator>/scripts/session-purge.sh

cu următorul cod în /home/<utilizator>/scripts/session-purge.sh:

cd /var/www/producție/curent
/usr/bin/rake db:session_purge RAILS_ENV=producția
Comentarii (2)

Crontab specificatii care a lucrat în trecut poate rupe atunci când sa mutat de la un crontab fișier la altul. Uneori, motivul este că te's-a mutat spec de la un sistem fișierul crontab pentru un utilizator fișierul crontab sau vice-versa.

Cron job specification format diferă între utilizatori' fișierele crontab (/var/spool/cron/numele de utilizator sau /var/spool/cron/crontabs/utilizator) și sistemul crontabs (/etc/crontab și fișierele din/etc/cron.d`).

Sistemul crontabs au un câmp suplimentar 'user' chiar înainte de comanda de pornire.

Acest lucru va cauza erori care să ateste astfel de lucruri george; comanda nu a fost găsit atunci când vă deplasați o comandă de /etc/crontab sau un fișier în/etc/cron.d în care un utilizator's fișierul crontab.

În schimb, cron va livra erori de genul /usr/bin/restartxyz nu este un nume de utilizator valid sau similar, atunci când invers se produce.

Comentarii (0)

cron script este invocând o comandă cu --verbose opțiune

Am avut un cron script nu pe mine, pentru că am fost într-pilot automat în timp ce tastați scenariul și am inclus --verbose opțiune:

#!/bin/bash
some commands
tar cvfz /my/archive/file.tar.gz /my/shared/directory
come more commands

Scenariul a alergat bine atunci când execută de la shell, dar nu a reușit atunci când rulează de la crontab pentru că o ieșire detaliată merge la stdout, atunci când a alerga de la shell, dar nu când fugi de crontab. Repara ușor pentru a elimina 'v':

#!/bin/bash
some commands
tar cfz /my/archive/file.tar.gz /my/shared/directory
some more commands
Comentarii (2)

Cel mai frecvent motiv am văzut cron eșua într-un mod incorect, a declarat programa. Este nevoie de practică pentru a specifica un loc de muncă programată pentru ora 11:15 pm ca 15 23 * * *"în loc de"* * 11 15 * " sau " 11 15 * * *. Ziua din săptămână pentru locuri de muncă, după miezul nopții, de asemenea, devine confuz M-F este de 2-6 după miezul nopții, nu 1-5. Datele specifice sunt de obicei o problema pentru ca am foarte rar le folosesc * * 3 1 * nu este de 3 Martie. Dacă nu sunteți sigur, verificați cron programe on-line de la https://crontab.guru/.

Dacă munca dumneavoastră cu platforme diferite folosind neacceptat opțiuni, cum ar fi 2/3 în timp caietul de sarcini poate provoca, de asemenea eșecuri. Aceasta este o opțiune foarte utilă, dar nu sunt universal disponibile. Am, de asemenea, a alerga peste probleme cu listele ca1-5 " sau " 1,3,5`.

Folosind necalificat căi, de asemenea, au cauzat probleme. Calea implicită este de obicei /bin:/usr/bin deci numai standard comenzi va rula. Aceste directoare, de obicei, don't au comanda dorită. Acest lucru afectează, de asemenea, script-uri folosind non-standard de comenzi. Alte variabile de mediu poate fi, de asemenea, lipsește.

Ciomăgeală existent crontab în întregime mi-a cauzat probleme. Acum încărcați dintr-un fișier copie. Acest lucru poate fi recuperat de la cele existente crontab folosind crontab -ldacă e lovit. I a păstra o copie a crontab în ~/bin. Este comentat de-a lungul și se termină cu linia# EOF`. Acest lucru este reîncărcată de zi cu zi de la un crontab de intrare, cum ar fi:

#!/usr/bin/crontab
# Reîncărcați această crontab
#
54 12 * * * ${HOME}/bin/crontab

Comanda reîncărcare de mai sus se bazează pe un executabil crontab cu un bang cale de rulare crontab. Unele sisteme necesită funcționare crontab în comandă și specificând fișierul. Dacă directorul este de rețea partajată, atunci eu de multe ori folosesc crontab.$(hostname)` ca nume de fișier. Acest lucru în cele din urmă corecte cazuri în care greșit crontab este încărcat pe server greșit.

Folosind fișierul oferă o copie de rezervă de ce crontab ar trebui să fie, și permite modificări temporare (singura dată când am folosi crontab -e) pentru a fi susținută în mod automat. Există antete disponibile care ajuta cu obtinerea de programare a parametrilor de dreapta. I le-au adăugat atunci când utilizatorii neexperimentați ar fi editarea unui crontab.

Rar, le-am rula în comenzi care necesită intrare de utilizator. Aceste eșua în crontab, deși unii vor lucra cu intrare de redirecționare.

Comentarii (3)

Dacă se accesează un cont prin chei SSH este posibil să vă conectați la cont, dar nu observați că parola de pe contul este blocat (de exemplu, din cauza la care expiră sau invalid password încercări)

Dacă sistemul este folosind PAM și contul este blocat, acest lucru poate opri cronjob de funcționare. (M-am'am testat acest lucru pe Solaris, dar nu pe Ubuntu)

S-ar putea găsi mesaje de genul asta in /var/adm/mesaje:

Data de 24 Oct, 07:51:00 mybox cron[29024]: [ID-ul 731128 auth.observa] pam_unix_account: cron încercarea de a valida cont blocat myuser de gazdă locală
Data de 24 Oct, 07:52:00 mybox cron[29063]: [ID-ul 731128 auth.observa] pam_unix_account: cron încercarea de a valida cont blocat myuser de gazdă locală
Data de 24 Oct, 07:53:00 mybox cron[29098]: [ID-ul 731128 auth.observa] pam_unix_account: cron încercarea de a valida cont blocat myuser de gazdă locală
Data de 24 Oct, 07:54:00 mybox cron[29527]: [ID-ul 731128 auth.observa] pam_unix_account: cron încercarea de a valida cont blocat myuser de gazdă locală

Tot ce trebuie să faceți este să rulați:

# passwd -u <numele de UTILIZATOR>

ca root pentru a debloca contul, și crontab ar trebui să funcționeze din nou.

Comentarii (0)

Dacă aveți o comandă de genul asta:

* * * * * /path/to/script >> /tmp/output

și asta nu't și't vedea nici o ieșire, aceasta nu înseamnă neapărat cron e't de lucru. Scenariul ar putea fi rupt și de ieșire de gând să stderr care nu't obține trecut de la /tmp/ieșire. Verifica acest lucru nu't caz, prin captarea această ieșire precum:

* * * * * /path/to/script >> /tmp/output 2>&1

pentru a vedea dacă acest lucru vă ajută să vă prinde problema ta.

Comentarii (0)

Am scris o instala script de shell, care creează un alt script pentru a curăța vechi de tranzacție date dintr-o bază de date. Ca o parte din sarcina a trebuit să configurați de zi cu zi cron de locuri de muncă pentru a rula la un moment arbitrar, atunci când baza de date de încărcare a fost scăzută.

Am creat un fișier mycronjob cu cron program, numele de utilizator & comanda si copiat-o de la/etc/cron.d` director. Meu doua chestii:

  1. `mycronjob dosarul lui a trebuit să fie deținută de root pentru a rula
  2. Am avut pentru a seta permisiunile de fișiere pentru a 644 - 664 nu ar rula.

O problemă de permisiune va apărea în /var/log/syslog ca ceva similar cu:

Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/cron.d/user)

Prima linie se referă la /etc/crontab fișier și cel mai târziu într-un fișier m-am plasat sub /etc/cront.d.

Comentarii (0)