Wo Cronjob reinschreiben?

Haxley

Member
Hallo,
ich weiß ist ne blöde Frage aber ich hatte mit Cronjobs bisher kaum was zu tun.
Nun benötige ich gleich mehrere.

Ich hab Debian 8 und brauche verschieden Cronjobs, welche eine PHP Datei ausführen.
Nun hab ich keine Lust das über die Console zu machen, sondern würde das gern in eine Datei setzen um das auch mal schnell zu ändern.

In welche Datei kann ich einen Cronjob eintragen?
Cronjob sieht so aus:

12 22 * * * root php - f /var/www/upload.php >> /var/log/plextura.log

eingetragen in die /etc/crontab passiert nichts.

Neue Datei unter /etc/cron.d mit dem gleichen Inhalt... passiert nichts.


Muss ich echt über die Console gehen um einen simplen Cornjob via crontab -e zu generieren? Oder geht das auch durch Hinzufügen zu einer bestehenden Datei oder ggf. einer Neuen?

Danke Gruß Haxley
 

Haxley

Member
hab jetzt eine Datei erstellt und lade die in der Console via crontab /var/www/cronjob.txt

Inhalt nun:
57 22 * * * /usr/bin/php - f /var/www/generierung.php

geht auch nicht
 
Last edited by a moderator:

Haxley

Member
hab in die /etc/crontab eingetragen:
23 23 * * * root /usr/bin/php -f /var/www/generierung.php

passiert leider garnichts
 

danton

Debian User
Beim Testen den Zeitpunkt nicht zu knapp wählen, sonst kann es passieren, dass cron die /etc/crontab nicht rechtzeitig anwendet.
Ist außerdem das Paket php5-cli installiert? Was sagen die Logs?
 

Fusl

Blog Benutzer
Ist das cron Package installiert? Auf Debian minimal Installationen ist das Paket Standardmäßig nicht installiert.

Probier mal mit
Code:
* * * * * root touch /crontest
und überprüf nach 5 Minuten ob die Datei /crontest nach ~5 Minuten auftaucht.
 

Thunderbyte

Moderator
Staff member
Einige Punkte:

Funktioniert der Befehl auf der Kommandozeile (also ohne die Zeitangaben?)?

Sind die Rechte korrekt, d.h. darf der User, in dessen Kontext der Cronjob ausgeführt werden soll das überhaupt / hat er Ausführungs- / Schreibrechte auf die Ordner/Files?

Ja, man muss wohl das Kommando per crontab -e eintragen.
 

Joe User

Zentrum der Macht
Ich würde es ja zuerst mal mit
Code:
23 4 * * * root php -f /var/www/upload.php >> /var/log/plextura.log
statt
Code:
23 4 * * * root php - f /var/www/upload.php >> /var/log/plextura.log
probieren.

Und um es ganz korrekt zu machen:
Code:
23 4 * * * root /usr/bin/php /var/www/upload.php >> /var/log/plextura.log
 

Joe User

Zentrum der Macht
Kleiner Tipp: Blindes Copy&Paste kann extrem schnell zu erheblichem Schaden führen...
Diesmal ist es nochmal gut gegangen, beim nächsten Mal geht es vielleicht schief...

Ein reiner Texteditor mit einer Unicode-Festbreitenschritart hilft hier ungemein...
 

DjTom-i

Member
Code:
*/2 * * * * root /usr/bin/php /var/www/generierung.php 1> /var/log/cronjob_debug_1.log 2> /var/log/cronjob_debug_2.log
Bitte einmal so debuggen.

Nach zwei Minuten sollte in /var/log/cronjob_debug_[12].log etwas stehen.
 

Haxley

Member
so hab das jetzt so in der crontab:
PHP:
*/4 * * * * root /usr/bin/php /var/www/auto_generierung.php -croncodezahl 1> /var/log/cronjob_gen_1.log 2> /var/log/cronjob_gen_2.log
und die Auswertung in PHP mit der globalen Variable $argv:
PHP:
<?php

 if ($argv[1] = croncodezahl) { 

....
}
kann man das so machen?
Das log meckert zwar aber es scheint zu gehen.
PHP:
PHP Notice:  Use of undefined constant cronxyz - assumed 'cronxyz' in /var/www/auto_generierung.php on line 2
 

danton

Debian User
PHP:
PHP Notice:  Use of undefined constant cronxyz - assumed 'cronxyz' in /var/www/auto_generierung.php on line 2
Die Fehlermeldung sagt es doch schon: cronxyz ist als Konstante nicht definiert, daher nimmt PHP an, dass es sich um einen String handelt. Schreib dein cronxyz in Zeile 2 in Anführungszeichen, dass wird es eindeutig, dass es ein String sein soll.
 

Haxley

Member
Hallo,
danke Euch, ich hab das jetzt so:
PHP:
if ($argv[1] = 'cron0815') {
und das geht.
Es wird halt geprüft ob die Systemvariable den Wert enthält, wenn ja dann wird das Script ausgeführt. Grund ist, dass das Script nicht so einfach von extern aufgerufen werden kann, da es im Web Root liegt.

Im crontab sieht das so aus:
PHP:
10 5 * * * root /usr/bin/php /var/www/auto_berechnung.php -cron0815 1> /var/log/cronjob_ber_1.log 2> /var/log/cronjob_ber_2.log
Geht soweit.

Aber ein Frage noch:

Mein cron läuft nicht mit der Systemzeit synchron, wie kann das sein und wie kann ich das beheben?
Kommando "date" in der Shell gibt die korrekte Uhrzeit aus. Crontab ist aber 2 Stunden verspätet. Beispiel: Ich lasse ein Script aller 10 min ausführen, dann steht im Log: Jun 6 04:20:01 franklin /USR/SBIN/CRON
Systemzeit ist aber Tue Jun 6 06:21:03 CEST 2017

Wenn ich ein Cronjob 6 Uhr laufen lassen möchte muss ich in der Crontab 4 Uhr eintragen.
Wie bekomme ich das Syncron?
Nutze übrigens Debian.

Tausend Dank nochmals.
Gruß Haxley
 

danton

Debian User
Hallo,
danke Euch, ich hab das jetzt so:
PHP:
if ($argv[1] = 'cron0815') {
und das geht.
Wenn du es genauso geschrieben hast, funktioniert es nicht so, wie du es haben möchtest. Das einfache Gleichzeichen ist ein Zuweisungsoperator, der normalerweise immer ein TRUE erzeugt (du weist $argv[1] den Wert "cron0815" zu) - du willst aber einen Vergleichsoperator nutzen (doppeltes bzw. dreifaches Gleichzeichen, siehe oben von GwenDragon verlinkte Doku).

Es wird halt geprüft ob die Systemvariable den Wert enthält, wenn ja dann wird das Script ausgeführt. Grund ist, dass das Script nicht so einfach von extern aufgerufen werden kann, da es im Web Root liegt.
Du kannst im Script auch abfragen, ob das Script per Apache-Modul, CGI oder CLI aufgerufen wurde, siehe http://php.net/manual/en/function.php-sapi-name.php

Mein cron läuft nicht mit der Systemzeit synchron, wie kann das sein und wie kann ich das beheben?
Wird er schon machen, aber ich vermute, dass bei dir die Zeitzonen ein wenig durcheinander sind (GMT und CEST)
 

DjTom-i

Member
Aber ein Frage noch:

Mein cron läuft nicht mit der Systemzeit synchron, wie kann das sein und wie kann ich das beheben?
Kommando "date" in der Shell gibt die korrekte Uhrzeit aus. Crontab ist aber 2 Stunden verspätet. Beispiel: Ich lasse ein Script aller 10 min ausführen, dann steht im Log: Jun 6 04:20:01 franklin /USR/SBIN/CRON
Systemzeit ist aber Tue Jun 6 06:21:03 CEST 2017
Code:
dpkg-reconfigure tzdata
 

GwenDragon

Registered User
(…) ich hab das jetzt so:
PHP:
if ($argv[1] = 'cron0815') {
und das geht.
Es wird halt geprüft ob die Systemvariable den Wert enthält, wenn ja dann wird das Script ausgeführt.
Sicher geht das, sowas nennt man schlampig programmiert und fehlende Fehlerprüfung durch PHP.

Es wird nicht geprüft ob die Systemvariable den Wert enthält, sondern du setzt so die Systemvariable immer auf einen wahren Wert, und dann ist die IF-Abfrage immer wahr und der nachfolgende Block gilt.

Du kannst dann auch schreiben:
PHP:
if (TRUE) {


Dein obiger Code ist ein extremer Anfängerfehler. Lernst du gerade PHP? oder kopierst du einfach von irgendwo Quellcode ohne Hintergrundwissen was das tut?
 
Last edited by a moderator:
Top