Crontab

Köra skript automatiskt

Säg att du vill göra en kalkyl en gång per dygn eller hämta hem någonting en gång per vecka. Hur löser du det?

❶ Skapar ett skript som gör det du vill göra
❷ Dubbelkolla att skriptet verkligen fungerar
❸ Lägger in skriptet i crontab

Den enklaste genvägen, för att allting ska fungera så snabbt som möjligt är faktiskt att ta omvägen över att faktiskt kontrollera att skriptet fungerar.

Skriva och testköra ett skript

Det är viktigt att veta att skripten som startas av crontab kör i en linuxmiljö och att alla interpretatorer och anrop anges med absoluta sökvägar (fullständiga sökvägar).

Vi tänker oss något enkelt exempel. Vi vill tanka ner RSS från NASA som innehåller "dagens bild". Så, vi laddar hem denna RSS och placerar i katalogen och sedan skriver vi ett litet PHP -skript som läser denna RSS -fil. RSS -filen uppdateras automatiskt 1 gång per dag med crontab, så vi har alltid en aktuell sida med dagens bild från NASA.

För att hämta hem en fil över internet kan vi använda wget. Med absolut sökväg ser anropet ut såhär.

wget -O /home/karlahosti/public_html/nasa.xml https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss

Vi testar att skriptet verkligen fungerar. Så jag loggar in med ssh.



Någonting har blivit hämtat. Jag öppnar filen som hämtats med nano nasa.xml och det ser väldigt XML -aktigt ut som en RSS -fil skall göra.



Vi kan snegla på hur stor filen är ls -al nasa.xml och det ser ju hanterbart ut.



Uppmuntrade av att vårt skript fungerar, så stoppar vi in det i crontab.

Klickar på Cron Jobs



Klickar på Create Cron Job.

Skriptet skall köra varje gång klockans Hour -siffra (tim -visaren alltså) slår över till 8. Dvs, klockan 8 på morgonen. Under Command knappar vi in anropet wget -O /home/karlahosti/public_html/nasa.xml https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss

Sedan klickar vi Create.



Konceptet här är ganska enkelt. Beroende på vilken frekvens (hur ofta) och vid vilken tidpunkt vi vill att skriptet skall köras, så stoppar vi in en siffra här någonstans.



Hursomhelst. Nu ligger vårt cronjob i listan över våra cronjobs ....



För att publicera vår RSS -fil (på XML -format) skriver vi ett litet PHP -skript.
<?php
if (file_exists('nasa.xml')) 
{
 $xml = simplexml_load_file('nasa.xml');
 foreach($xml->channel->item as $item)
 {
  $lnk = $item->link;
  $tle = $item->title;
  echo '<a href="'.$lnk.'" target="new">'.$tle.'</a><br/>';
 }
} 
else 
{
 exit('Lyckades inte öppna nasa.xml.');
}
?>

Här är då resultatet: Dagens bild från NASA.

Perl, PHP, m.fl. -skript

Det viktiga är enbart att full sökväg anges. Det gäller även interpretatorn, t.ex. perl.

Vi tänker oss något enkelt testskript som vi kallar perltest.pl som ligger i katalogen public_html/
#!/usr/bin/perl
use strict;
use warnings;

print "Karla hosting was here\n";

Fulla anropet som skall in i crontab är alltså
/usr/bin/perl /home/karlahosti/public_html/perltest.pl



Vi kan titta efter var PHP -interpretatorn ligger med which php och knacka in en litet skript.

<?php
echo "Karlahosting was here...";
?>

Den fullständiga sökvägen om vi vill lägga in detta i crontab blir alltså

/usr/local/bin/php /home/karlahosti/public_html/phptest.php



I verkligheten är det förstås inte meningsfullt om skripten skriver ut något utan förslagsvis behandlar de data i filer eller hämtar något eller kopierar något eller gör något annat meningsfullt.