24 april, 2012

Unix/Linux: Cron jobb med PHP CLI till logg med datum som filnamn

Tips:

Hur man skapar ett cronjobb på Unix/Linux med ett PHP-skript som körs som CLI kommando. Jag vill också att loggfilen sparas med dagens datum utan klockslag.

Observera att sökvägarna kan skilja för er i era miljöer.
  1. Skapa ett php skript som heter cron.php som gör något, t.ex uppdaterar cachade filer och spara den i /home/testuser/public_html/crontest/cron.php
  2. Ta reda på var binären för PHP finns
    $ whereis php
    /usr/local/bin/php
  3. Testkör skriptet och utdata skrivs till terminalen
    $ /usr/local/bin/php /home/testuser/public_html/crontest/cron.php
  4. Testa skriva ut dagens datum år månad datum
    $ date +"%y%m%d"
    120424
     
  5. Skapa en logg-katalog
    $ pwd
    /home/testuser/public_html/crontest

    $ mkdir log
     
  6. Kör skriptet igen men den här gången skickar vi utdata till en extern logg-fil.
    $ /usr/local/bin/php /home/testuser/public_html/crontest/cron.php >> /home/testuser/public_html/crontest/log/cron_`date +"\%y\%m\%d"`.log
     
  7. Lista loggar
    $ ls -latr log
    drwxr-xr-x 6 testuser testuser  4096 Apr 24 09:00 ../
    -rw-r--r-- 1 testuser testuser  1068 Apr 24 09:26 cron_120424.log
    drwxr-xr-x 2 testuser testuser  4096 Apr 24 09:26 ./
     
  8. Skriv ett cron-jobb med verktyget crontab
    # crontab -e
  9. Ange kommandot:
    30 7,12 * * 1-5 /usr/local/bin/php /home/testuser/public_html/crontest/cron.php >> /home/testuser/public_html/crontest/log/cron_`date +"\%y\%m\%d"`.log
  10. Det betyder att ett jobb kommer utföras varje måndag till fredag (1-5) kl 07.30 och 12.30, alla datum och månader. Mitt PHP-skript rensar cache och uppdaterar cache för ett system jag själv har utvecklat, och det behöver köras innan jag börjar varje vardagmorgon och under tiden jag har lunch.

    Smart va!?
  11. Tänk på att rensa de gamla filerna ibland i katalogen "log", vilket du också kan göra med ett cronjobb, för att hålla ordning och reda samt inte fylla disken med loggar som kan bli stora.
  12.  Om du vill kan du även lägga till aktuell timma i loggfilens namn för att få en separat logg för varje cronjobb om de körs exempelvis två gånger per dag vid olika timmar på dygnet.

    Testa följande:
    $ date +"%y%m%d%H"
    12042409

    Lägg bara in ändringen i kommandot som körs i crontab så är allt klart.
Felsökning?
Om du får problem och måste avbryta scriptet kan du kontrollera processen och kör sedan kill på processen PID.

$ ps -ef | grep php
$ kill -9

Loggen för cron-jobb brukar vara /var/log/cron och då är följande kommando bra att använda i ett extra terminalfönster under tiden som du arbetar och felsöker i ett annat:

$ tail -f /var/log/cron

Kolla gärna in stackoverflow också: http://stackoverflow.com/questions/2135478/how-to-simulate-the-environment-cron-executes-a-script-with

Förbättring
Efter att jag har kört lite har jag stött på miljö-problem i cron-miljön (cron environment). Till slut kom jag fram till att istället anropa skriptet som en hemsida och spara resultatet med wget.

Lägg bara in följande kommando i crontab så kommer det funka:
$  /usr/bin/wget -O cron_`date +"\%y\%m\%d\%H"`.log -P /home/testuser/public_html/crontest/tmp/ http://www.test.se/crontest/cron.php?passwd=lösenord-för-cron-jobb-här

.htaccess HTTP Authentication
 Om filen cron.php ligger i en katalog som är skyddad med HTTP Authentication i en .htaccess fil, så kan man tillåta åtkomst till filen cron.php utan att behöva ange användarnamn och lösenord. All annan åtkomst till andra filer i katalogen kräver användarnamn och lösenord.

 /crontest/.htaccess
 AuthType Basic
AuthName "Administration"
AuthUserFile /home/testuser/public_html/crontest/.htpasswd
Require valid-user
<Files "cron.php">
Satisfy any
</Files>



Tjao

Välkomna till bloggen

Välkomna ska ni vara kära besökare. Jag skriver om IT för att det är kul och för att jag vill dela med mig av information och kunskap. Jag försöker hålla bloggen så kategoriserad som möjligt för att ni enklare ska hitta intressanta länkar och artiklar.