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.
- 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
- Ta reda på var binären för PHP finns
$ whereis php
/usr/local/bin/php - Testkör skriptet och utdata skrivs till terminalen
$ /usr/local/bin/php /home/testuser/public_html/crontest/cron.php - Testa skriva ut dagens datum år månad datum
$ date +"%y%m%d"
120424
- Skapa en logg-katalog
$ pwd
/home/testuser/public_html/crontest
$ mkdir log
- 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
- 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 ./
- Skriv ett cron-jobb med verktyget crontab
# crontab -e - 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 - 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!? - 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.
- 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.
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