Programarea sarcinilor cu Cron Jobs

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.

Definiții

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.

De ce să folosiți posturile Cron?

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:

  • Dacă aveți un site de membru, în cazul în care conturile au date de expirare, aveți posibilitatea să programați lucrări cron pentru a dezactiva sau șterge în mod regulat conturile care au trecut de datele lor de expirare.
  • Puteți trimite e-mailuri zilnice de buletine informative.
  • Dacă aveți tabele rezumate (sau vizualizări concretizate) în baza de date, acestea pot fi actualizate periodic cu o activitate cron. De exemplu, puteți stoca fiecare lovitură dintr-o pagină web într-un tabel, dar un alt tabel rezumativ poate conține rezumate zilnice de trafic.
  • Puteți expira și șterge fișierele de date memorate într-un anumit interval.
  • Puteți verifica automat conținutul site-ului dvs. pentru link-uri întrerupte și puteți trimite un raport către dvs. în mod regulat.
  • Puteți programa sarcini de lungă durată pentru a rula dintr-un script de linie de comandă, în loc să îl rulați dintr-un script web. Ca și codarea videoclipurilor sau trimiterea de e-mailuri în masă.
  • Puteți chiar să efectuați ceva la fel de simplu ca și preluarea celor mai recente Tweets, pentru a fi stocat în memoria cache într-un fișier text.

Sintaxă

Iată o lucrare simplă:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Există două părți principale:

  1. Prima parte este "10 * * * *". Aici programăm cronometrul.
  2. Restul liniei este comanda, așa cum se va executa din linia de comandă.

Comanda însăși în acest exemplu are trei părți:

  1. "/ Usr / bin / php". Scripturile PHP, de obicei, nu sunt executabile singure. Prin urmare, trebuie să îl executăm prin parserul PHP.
  2. "/Www/virtual/username/cron.php". Aceasta este doar calea către scenariu.
  3. "> / dev / null 2> & 1". Această parte se ocupă de ieșirea scenariului. Mai multe despre asta mai târziu.

Sintaxă de sincronizare

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:

  1. minut
  2. ora
  3. zi a lunii
  4. lună
  5. zi a săptămânii

Iată o ilustrație:

Asterisc

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ă.

Exemple:

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ă]

Configurarea și gestionarea locurilor de muncă Cron

Există câteva moduri diferite de a crea și de a gestiona cron de locuri de muncă.

Panouri de control

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.

Editarea Crontab

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

Încărcarea unui fișier

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.

Comentarii

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

Setarea e-mailului

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

Utilizarea parserului PHP

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

Manipularea ieșirii

Dacă nu gestionați rezultatul scriptului cron, acesta va fi trimis ca e-mailuri în contul dvs. de utilizator de pe server.

Eliminarea ieșirii

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".

Efectuarea unui fișier

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

Scripturi executabile

Î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

Prevenirea coliziunii de locuri de muncă Cron

Î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.

Blocarea accesului Web la posturile Cron

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.

Concluzie

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ă!

Scrie un tutorial Plus

Ș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.

  • Urmați-ne pe Twitter sau abonați la Nettuts + RSS Feed pentru cele mai bune tutoriale de dezvoltare web de pe web.
Cod