Planleggingsoppgaver med Cron Jobs

Cron Jobs brukes til å planlegge oppgaver for å kjøre på serveren. De er oftest brukt til å automatisere systemvedlikehold eller administrasjon. Men de er også relevante for utvikling av webapplikasjoner. Det er mange situasjoner når et webprogram kan trenge visse oppgaver å kjøre regelmessig. I dag skal vi utforske grunnleggende for Cron Jobs.

definisjoner

Først må vi gjøre oss kjent med betingelsene knyttet til dette emnet.

"Cron" er en tidsbasert jobbplanlegger i Unix-lignende operativsystemer (Linux, FreeBSD, Mac OS etc ...). Og disse jobbene eller oppgavene refereres til som "Cron Jobs".

Det er en cron "daemon" som kjører på disse systemene. En demon er et program som kjører i bakgrunnen hele tiden, vanligvis startet av systemet. Denne cron-demonen er ansvarlig for å lansere disse cron-jobbene på skjema.

Tidsplanen ligger i en konfigurasjonsfil med navnet "crontab". Det er her alle oppgavene og deres timere er oppført.

Hvorfor bruke Cron Jobs?

Serveradministratorer har lenge brukt cron-jobber. Men siden målgruppen i denne artikkelen er webutviklere, la oss se på noen brukssaker av cron-jobber som er relevante i dette området:

  • Hvis du har et medlemskapsside, hvor kontoer har utløpsdatoer, kan du planlegge cron-jobber for regelmessig å deaktivere eller slette kontoer som er forbi deres utløpsdatoer.
  • Du kan sende ut daglig e-post med nyhetsbrev.
  • Hvis du har oversiktstabeller (eller materialiserte visninger) i databasen, kan de jevnlig oppdateres med en cron-jobb. For eksempel kan du lagre hver nettside som treffer i et bord, men et annet sammendragstabell kan inneholde daglige trafikkoppsummeringer.
  • Du kan utgå og slette cached datafiler i et bestemt intervall.
  • Du kan automatisk sjekke innholdet på nettstedet ditt for ødelagte koblinger og få en rapport som sendes til deg selv regelmessig.
  • Du kan planlegge lange løpende oppgaver for å kjøre fra et kommandolinjeskript, i stedet for å kjøre det fra et webscript. Liker å kode videoer, eller sende ut masse e-post.
  • Du kan til og med utføre noe så enkelt som å hente de siste Tweets, som skal lagres i en tekstfil.

syntax

Her er en enkel cron jobb:

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

Det er to hoveddeler:

  1. Den første delen er "10 * * * *". Det er her vi planlegger timeren.
  2. Resten av linjen er kommandoen som den ville løpe fra kommandolinjen.

Kommandoen selv i dette eksemplet har tre deler:

  1. "/ Usr / bin / php". PHP-skript er vanligvis ikke kjørbare av seg selv. Derfor må vi kjøre den gjennom PHP-parseren.
  2. "/Www/virtual/username/cron.php". Dette er bare banen til manuset.
  3. "> / dev / null 2> & 1". Denne delen håndterer resultatet av skriptet. Mer om dette senere.

Timing Syntax

Dette er den første delen av cron-arbeidsstrengen, som nevnt ovenfor. Det avgjør hvor ofte og når cron-jobben skal løpe.

Den består av fem deler:

  1. minutt
  2. time
  3. dag i måneden
  4. måned
  5. ukedag

Her er en illustrasjon:

Asterisk

Ganske ofte vil du se en stjerne (*) i stedet for et tall. Dette representerer alle mulige tall for den posisjonen. For eksempel vil stjerne i minuttposisjonen få det til å løpe hvert minutt.

Vi må se på noen få eksempler for å forstå denne syntaksen fullt ut.

eksempler:

Denne cron-jobben vil løpe hvert minutt hele tiden:

 * * * * * [kommando]

Denne cron-jobben vil kjøre i minuttet null, hver time (dvs. en time-cron-jobb):

 0 * * * * [kommando]

Dette er også en time-cron-jobb, men kjøre i minuttet 15 i stedet (dvs. 00:15, 01:15, 02:15 etc.):

 15 * * * * [kommando]

Dette vil løpe en gang om dagen, klokken 2:30:

 30 2 * * * [kommando]

Dette vil løpe en gang i måneden, den andre dagen i måneden ved midnatt (dvs. 2. januar kl 12:00, 2. februar kl 12:00)

 0 0 2 * * [kommando]

Dette vil løpe på mandager, hver time (det vil si 24 ganger på en dag, men bare på mandager):

 0 * * * 1 [kommando]

Du kan bruke flere tall separert med kommaer. Dette vil løpe tre ganger hver time, i minutter 0, 10 og 20:

 0,10,20 * * * * [kommando]

Divisjon operatør er også brukt. Dette vil løpe 12 ganger i timen, det vil si hvert 5. minutt:

 * / 5 * * * * [kommando]

Dash kan brukes til å spesifisere et område. Dette vil løpe en gang hver time mellom 5:00 og 10:00:

 0 5-10 * * * [kommando]

Også det er et spesielt søkeord som lar deg kjøre en cron jobb hver gang serveren startes på nytt:

 @reboot [kommando]

Sette opp og administrere Cron-jobber

Det er noen forskjellige måter å opprette og administrere dine cron-jobber.

Kontrollpaneler

Mange web hosting selskaper tilbyr kontrollpaneler for sine kunder. Hvis du er en av dem, kan du kanskje finne en seksjon i kontrollpanelet for å administrere dine cron-jobber.

Redigerer Crontab

Kjører denne kommandoen vil starte vi (tekstredigerer) og la deg redigere innholdet i crontab:

 crontab -e

Så det vil bidra til å være kjent med de grunnleggende vi-kommandoene, da det er ganske annerledes enn noen annen tekstredigerer du kanskje har jobbet med.

Hvis du bare vil se eksisterende crontab uten å redigere den, kan du kjøre denne kommandoen:

 crontab-l

For å slette innholdet av crontab:

 crontab -r

Laster inn en fil

Du kan skrive alle dine cron-jobber inn i en fil og deretter skyve den inn i crontaben:

 crontab cron.txt

Vær forsiktig, fordi dette vil overskrive alle eksisterende cron-jobber med innholdet i disse filene, uten advarsel.

kommentarer

Du kan legge til kommentarer etterfulgt av # -tegnet.

 # Denne cron-jobben gjør noe veldig viktig 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Angi e-posten

Som nevnt tidligere, sendes utgangen fra crons som standard via e-post, med mindre du kaster bort dem eller omdirigerer dem til en fil. MAILTO-innstillingen lar deg sette eller endre hvilken e-postadresse som skal sendes til:

 MAILTO = "[email protected]" # Denne cron-jobben gjør noe veldig viktig 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Bruke PHP Parser

CGI-skript kan kjøres som standard, men PHP-skript er ikke. De må løpe gjennom PHP-parseren. Derfor må vi legge banen til parseren før skriptets bane.

 * * * * * / usr / bin / php [sti til php script]

Noen ganger kan det være under et annet sted som: "/ usr / local / bin / php". For å finne ut, kan du prøve å kjøre dette på kommandolinjen:

 hvilken php

Håndtering av utgangen

Hvis du ikke håndterer utdataene fra cron-skriptet, vil den sende dem som e-post til din brukerkonto på serveren.

Kast utgang

Hvis du setter "> / dev / null 2> & 1" på slutten av cron-jobb-kommandoen (eller en kommando), vil utskriften bli kassert.

Lukkekonsollen (>) brukes til omdirigering av utgang. "/ dev / null" er som et svart hull for utgang. Alt som går der blir ignorert av systemet.

Denne delen "2> & 1" fører til at STDERR (feil) -utgangen blir omdirigert til STDOUT (normal) utgang. Så det ender også opp i "/ dev / null".

Outputting til en fil

For å lagre cron-utgangen i en fil, bruk lukkekonsollen (>) igjen:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> /var/log/cron.log

Det vil omskrive utdatafilen hver gang. Hvis du vil legge til utgangen på slutten av filen i stedet for en fullstendig omskrivning, bruk dobbelt lukkekonsoll (>>) i stedet:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php >> /var/log/cron.log

Executable Scripts

Normalt må du angi parseren i begynnelsen av kommandoen som vi har gjort. Men det er faktisk en måte å gjøre PHP-skriptene dine kjørbare fra kommandolinjen som et CGI-skript.

Du trenger å legge til banen til parseren som den første linjen i skriptet:

 #! / Usr / local / bin / php 

Pass også på å sette riktig chmod (som 755) for å gjøre filen kjørbar.

Når du har et kjørbart skript, kan cron-jobben være kortere slik:

 10 * * * * /www/virtual/username/hello.php

Forhindre Cron Jobb Kollisjon

I noen tilfeller kan du ha hyppige løpende cron-jobber, og du vil kanskje ikke at de skal kollidere hvis de tar lengre tid å løpe enn selve frekvensen.

For eksempel kan du ha en cron-jobb som kjører hvert minutt. Likevel kan det ta lengre tid enn ett minutt å løpe hver gang. Dette kan føre til at en annen forekomst av det samme cron-skriptet begynner å kjøre før den forrige avslutter. Du kan lage for mange opptatt prosesser på denne måten og muligens krasje serveren hvis de fortsetter å senke hverandre, og føre til at flere prosesser blir opprettet over tid ...

Dette problemet kan løses via fillåsing, og nærmere bestemt låser ikke-blokkerende (LOCK_NB) filtypen. (Hvis du ikke er kjent med fillåsing, foreslår jeg at du leser om det først.)

Du kan legge til denne koden i cron jobbscript:

 $ fp = fopen ('/ tmp / lock.txt', 'r +'); hvis (! flokk ($ fp, LOCK_EX | LOCK_NB)) echo 'Kan ikke skaffe lås'; exit (1);  / * ... * / fclose ($ fp);

Med vanlige fillås vil flokken () funksjonssamtalen blokkere skriptet hvis det finnes en eksisterende lås. Og det ville frigjøre en gang at låsen er borte. Men med en ikke-blokkerende lås, for eksempel i koden ovenfor, stopper funksjonsanropet ikke skriptet, men returnerer umiddelbart FALSE hvis det finnes en eksisterende lås. Så i dette tilfellet kan vi umiddelbart gå ut av skriptet når vi ser at det finnes en eksisterende lås, noe som indikerer at en annen cron-jobb for tiden kjører.

Blokkerer nettilgang til Cron Jobs

Når du skriver en cron-jobb i et webspråkspråk som PHP, kan du være sikker på at ingen kan utføre det ved bare å laste det fra nettleseren. Et enkelt alternativ ville være å lagre disse skriptene utenfor webmappen din. Dette kan imidlertid ikke være praktisk eller foretrukket for noen utviklere, hvis de ønsker å beholde sine cron jobbsskript rett innenfor deres webapplikasjonsmapper.

Hvis du setter alle cron-jobbskriptene i en mappe, blokkerer du tilgang ved å sette denne linjen i en .htaccess-fil:

 nekte fra alle

Eller du kan også nekte tilgang til skript på individuell basis ved å sette denne linjen i begynnelsen:

 hvis (isset ($ _ SERVER ['REMOTE_ADDR'])) dør ('Tillatelse nektet.');

Dette vil sikre at når man får tilgang til skriptet fra nettet, vil det avbryte umiddelbart.

Konklusjon

Takk for at du leser. Selv om cron-jobber bare virker som et verktøy bare for systemadministratorer, er de faktisk relevante for mange typer webapplikasjoner.

Vennligst legg inn dine kommentarer og spørsmål, og ha en flott dag!

Skriv en Plus Tutorial

Visste du at du kan tjene opp til $ 600 for å skrive en PLUS-opplæring og / eller screencast for oss? Vi leter etter dybde og velskrevne opplæringsprogrammer om HTML, CSS, PHP og JavaScript. Hvis du er i stand til å kontakte Jeffrey på [email protected].

Vær oppmerksom på at faktisk kompensasjon vil være avhengig av kvaliteten på den endelige opplæringen og screencast.

  • Følg oss på Twitter, eller abonner på Nettuts + RSS-feed for de beste webutviklingsopplæringene på nettet.