Activitățile Cron sunt utilizate pentru programarea sarcinilor pentru a rula pe server. Acestea sunt utilizate cel mai frecvent pentru automatizarea întreținerii sau administrării sistemului. Cu toate acestea, acestea sunt relevante și pentru dezvoltarea aplicațiilor web. Există multe situații în care o aplicație web poate necesita anumite sarcini pentru a rula periodic. Astăzi vom explora fundamentele Cron Jobs.
Mai întâi, să ne familiarizăm cu termenii legați de acest subiect.
"Cron" este un programator de timp bazat pe timp în sisteme de operare asemănătoare Unix (Linux, FreeBSD, Mac OS etc.). Iar aceste locuri de muncă sau sarcini sunt denumite "Cron Jobs".
Există un cron "daemon" care rulează pe aceste sisteme. Un daemon este un program care rulează tot timpul în fundal, inițiat de obicei de sistem. Acest demo cron este responsabil pentru lansarea acestor cron job-uri la timp.
Programul se află într-un fișier de configurare numit "crontab". Aici sunt listate toate sarcinile și cronometrele lor.
Administratorii de servere au folosit cron-urile pentru o lungă perioadă de timp. Dar, deoarece publicul țintă al acestui articol este dezvoltatorii web, să examinăm câteva cazuri de utilizare a cron de locuri de muncă care sunt relevante în acest domeniu:
Iată o lucrare simplă:
10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
Există două părți principale:
Comanda însăși în acest exemplu are trei părți:
Aceasta este prima parte a șirului de sarcini cron, așa cum am menționat mai sus. Acesta determină cât de des și când se va executa lucrarea cron.
Se compune din cinci părți:
Iată o ilustrație:
Destul de des, veți vedea un asterisc (*) în loc de un număr. Aceasta reprezintă toate numerele posibile pentru această poziție. De exemplu, asteriscul în poziția minute ar face să ruleze în fiecare minut.
Trebuie să analizăm câteva exemple pentru a înțelege pe deplin această sintaxă.
Această sarcină cron va rula în fiecare minut, tot timpul:
* * * * * [comandă]
Această lucrare cron va rula la zero zero, în fiecare oră (adică o lucrare cron orară):
0 * * * * [comandă]
Aceasta este, de asemenea, o sarcină orară cron pe oră, dar se execută în loc de 15 minute (adică 00:15, 01:15, 02:15 etc.):
15 * * * * [comandă]
Acest lucru va dura o dată pe zi, la ora 2:30 am:
30 2 * * * [comandă]
Aceasta se va desfășura o dată pe lună, în a doua zi a lunii, la miezul nopții (adică 2 ianuarie 12:00, 2 februarie 12:00 am etc.):
0 0 2 * * [comandă]
Aceasta va funcționa în zilele de luni, în fiecare oră (adică de 24 de ori într-o zi, dar numai în zilele de luni):
0 * * * 1 [comandă]
Puteți utiliza numere multiple separate prin virgule. Aceasta se va executa de trei ori pe oră, în minute 0, 10 și 20:
0,10,20 * * * * [comandă]
Divizorul este de asemenea utilizat. Aceasta se va desfășura de 12 ori pe oră, adică la fiecare 5 minute:
* / 5 * * * * [comandă]
Dash poate fi folosit pentru a specifica un interval. Aceasta se va desfășura o dată la fiecare oră între orele 5:00 și 10:00:
0 5-10 * * * [comandă]
De asemenea, există un cuvânt cheie special care vă va permite să executați o activitate cron de fiecare dată când serverul este repornit:
@reboot [comandă]
Există câteva moduri diferite de a crea și de a gestiona cron de locuri de muncă.
Multe companii de gazduire web ofera panouri de control pentru clientii lor. Dacă sunteți unul dintre ei, este posibil să găsiți o secțiune în panoul de control pentru a gestiona lucrările dvs. cron.
Rularea acestei comenzi va lansa vi (editorul de text) și vă va permite să editați conținutul crontab-ului:
crontab -e
Deci, aceasta ar ajuta să vă familiarizați cu comenzile de bază vi, deoarece este destul de diferit de orice alt editor de text cu care ați lucrat.
Dacă doriți să vedeți crontabul existent fără a îl edita, puteți rula această comandă:
crontab -l
Pentru a șterge conținutul crontab:
crontab -r
Puteți scrie toate lucrările dvs. cron într-un fișier și apoi îl împingeți în crontab:
crontab cron.txt
Aveți grijă, deoarece acest lucru va suprascrie toate lucrările cron existente cu acest conținut fișiere, fără avertisment.
Puteți adăuga comentarii urmate de caracterul #.
# Acest lucru cron face ceva foarte important 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
După cum am menționat mai devreme, în mod prestabilit, ieșirea din cronuri este trimisă prin e-mail, cu excepția cazului în care le eliminați sau le redirecționați către un fișier. Setarea MAILTO permiteți setarea sau modificarea adresei de e-mail pe care să o trimiteți:
MAILTO = "[email protected]" # Această lucrare cron face ceva foarte important 10 / * / * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
Scripturile CGI sunt executabile în mod implicit, dar script-urile PHP nu sunt. Ei trebuie să treacă prin parserul PHP. De aceea trebuie să punem calea către parser înainte de calea scenariului.
* * * * * / usr / bin / php [calea către scriptul php]
Uneori ar putea fi sub o altă locație, cum ar fi: "/ usr / local / bin / php". Pentru a afla, puteți încerca să rulați acest lucru în linia de comandă:
care php
Dacă nu gestionați rezultatul scriptului cron, acesta va fi trimis ca e-mailuri în contul dvs. de utilizator de pe server.
Dacă introduceți "> / dev / null 2> & 1" la sfârșitul comenzii de comandă cron (sau orice comandă), ieșirea va fi eliminată.
Partea de închidere (>) este utilizată pentru redirecționarea ieșirii. "/ dev / null" este ca o gaură neagră pentru ieșire. Orice care merge acolo este ignorat de sistem.
Această parte "2> & 1" face ca ieșirea STDERR (eroare) să fie redirecționată la ieșirea STDOUT (normal). Deci, de asemenea, se termină în "/ dev / null".
Pentru a stoca ieșirea cron într-un fișier, utilizați din nou consola de închidere (>):
10 * * * * / usr / bin / php /www/virtual/username/cron.php> /var/log/cron.log
Aceasta va rescrie fișierul de ieșire de fiecare dată. Dacă doriți să adăugați ieșirea la sfârșitul fișierului în loc de o rescriere completă, utilizați consola de închidere dublă (>>) în schimb:
10 * * * * / usr / bin / php /www/virtual/username/cron.php >> /var/log/cron.log
În mod normal, trebuie să specificați parserul la începutul comenzii așa cum am făcut-o. Dar există, de fapt, o modalitate de a face script-urile PHP executabile din linia de comandă ca un script CGI.
Trebuie să adăugați calea parserului ca prima linie a scriptului:
#! / Usr / local / bin / php
De asemenea, asigurați-vă că ați setat corect chmod (ca 755) pentru a face fișierul executabil.
Când aveți un script executabil, lucrarea cron poate fi mai scurtă ca aceasta:
10 * * * * /www/virtual/username/hello.php
În unele cazuri, este posibil să fiți frecvent derulați în cron și este posibil să nu doriți ca aceștia să se ciocnească dacă durează mai mult timp decât frecvența.
De exemplu, este posibil să aveți o activitate cron care rulează în fiecare minut. Totuși, din când în când, poate dura mai mult de un minut pentru a alerga. Acest lucru poate determina o altă instanță a aceluiași script cron să înceapă înainte de terminarea precedentă. Puteți crea prea multe procese ocupate în acest fel și, eventual, puteți prăbuși serverul dacă acestea încetinesc unul pe celălalt și provoacă și mai multe procese în timp ...
Această problemă poate fi rezolvată prin blocarea fișierelor și, mai specific, blocarea fișierelor (LOCK_NB) care nu se blochează. (Dacă nu sunteți familiarizat cu blocarea fișierelor, vă sugerăm să citiți mai întâi acest lucru.)
Puteți adăuga acest cod în scriptul de activitate cron:
$ fp = fopen ('/ tmp / lock.txt', 'r +'); dacă ! flock ($ fp, LOCK_EX | LOCK_NB)) echo 'Nu se poate obține blocarea'; ieșire (-1); / * ... * / fclose ($ fp);
Cu blocarea obișnuită a fișierelor, apelul funcției flock () ar bloca scriptul dacă există o blocare existentă. Și o să elibereze odată ce blocarea a dispărut. Cu toate acestea, cu o blocare fără blocare, cum ar fi în codul de mai sus, apelul funcției nu oprește scenariul, dar returnează imediat FALSE dacă există o blocare existentă. Deci, în acest caz, putem ieși imediat din scenariu când vedem că există o blocare existentă, ceea ce indică faptul că o altă lucrare cron rulează în prezent.
Când scrieți o lucrare cron într-o limbă de scripting web, cum ar fi PHP, vă recomandăm să vă asigurați că nimeni nu o poate executa doar prin încărcarea browserului. O opțiune ușoară ar fi să stocați aceste script-uri în afara folderului Web. Cu toate acestea, acest lucru poate să nu fie practic sau preferabil pentru unii dezvoltatori, dacă doresc să păstreze scripturile lor de lucru cron chiar în dosarele lor de aplicații web.
Dacă puneți toate script-urile de lucru cron într-un dosar, blocați accesul punând această linie într-un fișier .htaccess:
nega de la toate
Sau puteți, de asemenea, să refuzați accesul la scripturi pe o bază individuală, punând această linie la început:
dacă (isset ($ _ SERVER ['REMOTE_ADDR'])) mor ("Permisiune respinsă");
Acest lucru va asigura că, atunci când scriptul este accesat de pe web, acesta va anula imediat.
Mulțumesc că ați citit. Chiar dacă lucrările cron par a fi doar un instrument doar pentru administratorii de sistem, ele sunt relevante pentru multe tipuri de aplicații web.
Vă rugăm să lăsați comentariile și întrebările dvs. și să aveți o zi minunată!
Știați că puteți câștiga până la 600 USD pentru a scrie un tutorial PLUS și / sau pentru noi? Căutăm tutoriale detaliate și bine scrise despre HTML, CSS, PHP și JavaScript. Dacă sunteți în măsură, contactați Jeffrey la [email protected].
Rețineți că o compensație reală va depinde de calitatea tutorialului final și a scenariului.