Schemaläggningsuppgifter med Cron Jobs

Cronjobb används för att schemalägga uppgifter som ska köras på servern. De används mest för att automatisera systemunderhåll eller administration. Men de är också relevanta för webbapplikationsutveckling. Det finns många situationer när en webbapplikation kan behöva vissa uppgifter att köra regelbundet. Idag ska vi utforska grunderna för Cron Jobs.

Definitioner

Först låt oss bekanta oss med villkoren relaterade till detta ämne.

"Cron" är en tidsbaserad jobbschemaläggare i Unix-liknande operativsystem (Linux, FreeBSD, Mac OS etc ...). Och dessa jobb eller uppgifter kallas "Cron Jobs".

Det finns en cron "daemon" som körs på dessa system. En demon är ett program som körs i bakgrunden hela tiden, som vanligtvis initieras av systemet. Denna cron-demon är ansvarig för att lansera dessa cron-jobb i schema.

Schemat finns i en konfigurationsfil med namnet "crontab". Det är där alla uppgifter och deras timers listas.

Varför använda Cron Jobs?

Serveradministratörer har använt cron-jobb under lång tid. Men eftersom målgruppen för denna artikel är webbutvecklare, låt oss titta på några användningsfall av cron-jobb som är relevanta i detta område:

  • Om du har en medlemsplats där konton har utgångsdatum kan du schemalägga cron-jobb för att regelbundet avaktivera eller radera konton som är förbi sina utgångsdatum.
  • Du kan skicka ut det dagliga nyhetsbrevet.
  • Om du har sammanfattande tabeller (eller materialiserade visningar) i din databas, kan de uppdateras regelbundet med ett cron-jobb. Till exempel kan du lagra varje webbsida som träffas i en tabell, men en annan sammanfattande tabell kan innehålla dagliga trafiköversikter.
  • Du kan utgå och radera cachade datafiler i ett visst intervall.
  • Du kan automatiskt kontrollera ditt hemsida innehåll för trasiga länkar och få en rapport som skickas till dig själv regelbundet.
  • Du kan schemalägga långvariga uppgifter för att köras från ett kommandoradsskript, snarare än att köra det från ett webbscript. Gilla kodning av videoklipp, eller skicka ut massa e-post.
  • Du kan även utföra något så enkelt som att hämta dina senaste tweets, som ska cachas i en textfil.

Syntax

Här är ett enkelt cronjobb:

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

Det finns två huvuddelar:

  1. Den första delen är "10 * * * *". Här planerar vi timern.
  2. Resten av raden är kommandot som det skulle springa från kommandoraden.

Kommandot själv i det här exemplet har tre delar:

  1. "/ Usr / bin / php". PHP-skript är vanligtvis inte exekverbara av sig själva. Därför måste vi köra det via PHP-parsern.
  2. "/Www/virtual/username/cron.php". Detta är bara sökvägen till manuset.
  3. "> / dev / null 2> & 1". Den här delen hanterar skrivarens utdata. Mer om detta senare.

Timningssyntax

Detta är den första delen av cron-arbetssträngen, som nämnts ovan. Det bestämmer hur ofta och när cronjobbet ska köras.

Den består av fem delar:

  1. minut
  2. timme
  3. dag i månaden
  4. månad
  5. dag i veckan

Här är en illustration:

Asterisk

Sällan kommer du att se en asterisk (*) istället för ett nummer. Detta representerar alla möjliga tal för den positionen. Till exempel skulle asterisk i minutläget få det att springa varje minut.

Vi behöver titta på några exempel för att fullt ut förstå denna syntax.

Exempel:

Detta cron jobb kommer att köras varje minut hela tiden:

 * * * * * [kommando]

Detta cronjobb kommer att köras i minut noll, varje timme (dvs ett timmes cronjobb):

 0 * * * * [kommando]

Detta är också ett timmes cronjobb men kör i minut 15 istället (dvs 00:15, 01:15, 02:15 etc.):

 15 * * * * [kommando]

Detta kommer att köras en gång om dagen, klockan 02:30

 30 2 * * * [kommando]

Detta kommer att köras en gång i månaden, den andra dagen i månaden vid midnatt (dvs 2 januari 12:00, 2 februari 12:00, etc.):

 0 0 2 * * [kommando]

Detta kommer att köras på måndagar, varje timme (det vill säga 24 gånger på en dag, men endast på måndagar):

 0 * * * 1 [kommando]

Du kan använda flera nummer separerade med kommatecken. Detta kommer att köras tre gånger per timme, i minuter 0, 10 och 20:

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

Division operatör används också. Detta kommer att köras 12 gånger per timme, dvs var 5: e minut:

 * / 5 * * * * [kommando]

Dash kan användas för att specificera ett intervall. Detta kommer att köras en gång i timmen mellan 5:00 och 10:00

 0 5-10 * * * [kommando]

Det finns också ett speciellt nyckelord som låter dig köra ett cron-jobb varje gång servern startas om:

 @ reboot [command]

Konfigurera och hantera Cron-jobb

Det finns några olika sätt att skapa och hantera dina cronjobb.

Kontrollpaneler

Många webbhotell tillhandahåller kontrollpaneler för sina kunder. Om du är en av dem kan du kanske hitta en sektion på kontrollpanelen för att hantera dina cronjobb.

Redigering av Crontab

Om du kör det här kommandot startar vi (textredigerare) och låter dig redigera innehållet i crontab:

 crontab -e

Så det skulle hjälpa till att vara bekant med de grundläggande vi-kommandona eftersom det är helt annorlunda än någon annan textredigerare som du kanske har arbetat med.

Om du bara vill se den befintliga crontaben utan att redigera den kan du köra det här kommandot:

 crontab-l

För att ta bort innehållet i crontab:

 crontab-r

Laddar en fil

Du kan skriva alla dina cron jobb i en fil och sedan trycka den in i crontab:

 crontab cron.txt

Var försiktig, eftersom detta kommer att överskriva alla befintliga cronjobb med innehållet i denna fil utan varning.

kommentarer

Du kan lägga till kommentarer följt av # tecknet.

 # Det här cronjobbet gör något väldigt viktigt 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Ställa in e-postmeddelandet

Som jag nämnde tidigare skickas utmatningen från krönorna som standard via e-post, om du inte kasserar dem eller omdirigerar dem till en fil. MAILTO-inställningen låter dig ställa in eller ändra vilken e-postadress som ska skickas till:

 MAILTO = "anvä[email protected]" # Det här cronjobbet gör något mycket viktigt 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Använda PHP Parser

CGI-skript är exekverbara som standard, men PHP-skript är inte. De måste springa igenom PHP-parsern. Därför måste vi lägga vägen till parsern före manusens väg.

 * * * * * / usr / bin / php [sökväg till php script]

Ibland kan det vara under en annan plats som: "/ usr / local / bin / php". För att ta reda på det kan du prova att köra det här på kommandoraden:

 vilken php

Hantering av utgången

Om du inte hanterar utmatningen från cron-skriptet, skickar den dem som e-post till ditt användarkonto på servern.

Kassera utmatning

Om du lägger "> / dev / null 2> & 1" i slutet av kommandot cron-jobb (eller något kommando) kommer utmatningen att kasseras.

Stängningsfästet (>) används för omdirigering av utgången. "/ dev / null" är som ett svart hål för utmatning. Allt som går där ignoreras av systemet.

Denna del "2> & 1" orsakar att STDERR (fel) -utmatningen omdirigeras till STDOUT-utgången (normal). Så det slutar också i "/ dev / null".

Utmatning till en fil

För att lagra cron-utgången i en fil, använd stängningsfästet (>) igen:

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

Det kommer att skriva om utgångsfilen varje gång. Om du vill lägga till utdatan i slutet av filen istället för en fullständig omskrivning, använd den dubbla stängningsfästet (>>) istället:

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

Exekverbara skript

Normalt måste du ange parsern i början av kommandot som vi har gjort. Men det finns faktiskt ett sätt att göra dina PHP-skript körbara från kommandoraden som ett CGI-skript.

Du behöver är att lägga till sökvägen till parsern som första raden i manuset:

 #! / Usr / local / bin / php 

Se också till att du anger rätt chmod (som 755) för att göra filen körbar.

När du har ett körbart script kan cron-jobbet vara kortare så här:

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

Förhindra Cron jobb kollision

I vissa fall kan du ofta köra cron-jobb, och du kanske inte vill att de ska kollidera om de tar längre tid att springa än själva frekvensen.

Du kan till exempel ha ett cron-jobb som körs varje minut. Men varje gång kan det ta längre tid än en minut att springa. Detta kan orsaka att en annan instans av samma cron-skript börjar starta innan den föregående avslutas. Du kan skapa för många upptagna processer på detta sätt och eventuellt krascha servern om de fortsätter att sakta ner varandra och orsaka att ännu fler processer skapas över tiden ...

Detta problem kan åtgärdas via fillåsning, och mer specifikt låser den icke-blockerande (LOCK_NB) filtypen. (Om du inte känner till fillåsning, föreslår jag att du läser om det först.)

Du kan lägga till den här koden i cron jobbscript:

 $ fp = fopen ('/ tmp / lock.txt', 'r +'); om (! flock ($ fp, LOCK_EX | LOCK_NB)) echo 'Kan inte hämta lås'; exit (-1);  / * ... * / fclose ($ fp);

Med vanliga fillås skulle flock () funktionssamtalet blockera skriptet om det finns ett befintligt lås. Och det skulle släppa en gång att låset är borta. Med ett icke-blockerande lås, t.ex. i koden ovan, stoppar funktionsanropet inte skriptet, men returnerar omedelbart FALSE om det finns ett befintligt lås. Så i det här fallet kan vi omedelbart avsluta skriptet när vi ser att det finns ett befintligt lås vilket tyder på att ett annat cronjobb är igång.

Blockerar webbåtkomst till Cron Jobs

När du skriver ett cron-jobb i ett webbspråk som PHP kan du se till att ingen kan utföra det genom att bara ladda det från webbläsaren. Ett enkelt alternativ skulle vara att lagra dessa script utanför din webbmapp. Detta kan dock inte vara praktiskt eller föredraget för vissa utvecklare, om de vill behålla sina cron-jobbskript rätt i sina webbapplikationsmappar.

Om du lägger alla cron-jobbskript i en mapp blockerar du åtkomst genom att sätta den här raden i en .htaccess-fil:

 förneka allt från alla

Eller du kan också neka åtkomst till skript på individuell basis genom att lägga den här linjen i början:

 om (isset ($ _ SERVER ['REMOTE_ADDR'])) dö ('Tillstånd nekat.');

Detta kommer att se till att när man kommer åt skriptet från webben, kommer det att avbryta omedelbart.

Slutsats

Tack för att du läste. Även om cron-jobb bara verkar som ett verktyg bara för systemadministratörer, är de faktiskt relevanta för många typer av webbapplikationer.

Vänligen lämna dina kommentarer och frågor, och ha en bra dag!

Skriv en Plus-handledning

Visste du att du kan tjäna upp till $ 600 för att skriva en PLUS-handledning och / eller screencast för oss? Vi letar efter djupgående och välskrivna handledning på HTML, CSS, PHP och JavaScript. Om du har förmåga, kontakta Jeffrey på [email protected].

Observera att den faktiska ersättningen kommer att vara beroende av kvaliteten på den slutliga handledningen och screencast.

  • Följ oss på Twitter, eller prenumerera på Nettuts + RSS-flödet för de bästa webbutvecklingsstudierna på webben.