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.
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.
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:
Här är ett enkelt cronjobb:
10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
Det finns två huvuddelar:
Kommandot själv i det här exemplet har tre delar:
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:
Här är en illustration:
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.
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]
Det finns några olika sätt att skapa och hantera dina cronjobb.
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.
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
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.
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
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
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
Om du inte hanterar utmatningen från cron-skriptet, skickar den dem som e-post till ditt användarkonto på servern.
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".
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
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
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.
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.
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!
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.