Mai mult
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:
- greșit crontab notație
- permisiuni problema
- 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.
530
46
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:
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 runnning
somecommand 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.
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.
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):Cron daemon nu se execută. Chiar am dat-o în bară cu asta acum câteva luni.
Tip:
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.
EDIT: de Asemenea, ai putea folosi systemctl în moderne de Linux, de ex.
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):
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.Î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ă:
sh -c "mycommand"
bash -c "mybashcommand"
SHELL=/bin/bash
!/bin/bash
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:
Calea absolută ar trebui să fie utilizate pentru script-uri:
De exemplu,
/bin/grep
ar trebui să fie folosit în loc degrep
:În loc de:
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.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
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ă.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:
ar trebui să fie editate (
sudo nano /etc/rsyslog.conf
) necomentate la:După aceea, aveți nevoie pentru a reporni rsyslog prin
sau
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
pentru a vizualiza cron legate de mesaje.
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.
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.
Nesigur cron masă permisiunea
Un tabel cron este rejected în cazul în care permisiunea este nesigur
Problema este rezolvată cu
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
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
: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.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:
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':
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, nu1-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 ca
1-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 -l
dacă 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: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.
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:
Tot ce trebuie să faceți este să rulați:
ca root pentru a debloca contul, și crontab ar trebui să funcționeze din nou.
Dacă aveți o comandă de genul asta:
ș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:
pentru a vedea dacă acest lucru vă ajută să vă prinde problema ta.
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:O problemă de permisiune va apărea în
/var/log/syslog
ca ceva similar cu: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
.