Cronjob wird nicht richtig ausgeführt?
Frage steht oben. Hier sind ein paar Informationen: Ich will ein PHP-Skript laufen lassen, dass in diesem Fall zum Test nur eine Datei löschen soll. Dies funktioniert jedoch leider nicht. Damit meine ich, dass diese Datei einfach nicht gelöscht wird. Die PHP-Datei liegt mit der PDF in einem Ordner, der über der Hauptebene der Domain liegt, sodass die Datei über das Web nicht aufrufbar ist.
PHP:
<?php
unlink('43772027_1.pdf');
?>
Der Cronjob:
30 11 * * * root /usr/bin/php/7.0 /var/www/html/doc/delete.php &> /var/www/html/doc/error.log
Der Log von Cronjob (so aufgerufen: grep CRON /var/log/syslog):
Jun 27 06:35:01 vmd27172 CRON[8416]: (root) CMD (sync; echo 3 > /proc/sys/vm/drop_caches)
Jun 27 06:39:01 vmd27172 CRON[8515]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 07:09:01 vmd27172 CRON[10874]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 07:17:01 vmd27172 CRON[11110]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 27 07:35:01 vmd27172 CRON[12972]: (root) CMD (sync; echo 3 > /proc/sys/vm/drop_caches)
Jun 27 07:39:01 vmd27172 CRON[13051]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 08:09:01 vmd27172 CRON[15298]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 08:17:01 vmd27172 CRON[15521]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 27 08:35:01 vmd27172 CRON[17497]: (root) CMD (sync; echo 3 > /proc/sys/vm/drop_caches)
Jun 27 08:39:01 vmd27172 CRON[17574]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 09:09:01 vmd27172 CRON[19752]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 09:17:01 vmd27172 CRON[19971]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 27 09:35:01 vmd27172 CRON[21815]: (root) CMD (sync; echo 3 > /proc/sys/vm/drop_caches)
Jun 27 09:39:01 vmd27172 CRON[21902]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 10:09:01 vmd27172 CRON[24181]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 10:17:01 vmd27172 CRON[24437]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 27 10:35:01 vmd27172 CRON[26409]: (root) CMD (sync; echo 3 > /proc/sys/vm/drop_caches)
Jun 27 10:39:01 vmd27172 CRON[26501]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 11:09:01 vmd27172 CRON[28840]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Jun 27 11:17:01 vmd27172 CRON[29146]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jun 27 11:19:01 vmd27172 CRON[29188]: (root) CMD (root /usr/bin/php/7.0 /var/www/html/doc/delete.php &> /var/www/html/doc/error.log)
Jun 27 11:30:01 vmd27172 CRON[31037]: (root) CMD (root /usr/bin/php/7.0 /var/www/html/doc/delete.php &> /var/www/html/doc/error.log)
4 Antworten
/usr/bin/php/7.0/php /var/www/html/doc/delete.php
müsste es vieleicht heißen. Bevor Du das in die Cron einträgst, versuch das mal über die Kommandozeile. So habe ich das immer gemacht.
Der Hinweis von Isenfdrak mit den absoluten Pfaden würde ich genau sehen.
Das dürfte wohl daran liegen, dass die Datei /43772027_1.pdf nicht existiert.
Zur Erklärung: CRON (und jeder andere Daemon auch) verwendet (meistens) / als Arbeitsverzeichnis. Da du nur einen relativen Pfad angegeben hast, wird die Datei in einem Pfad relativ zum Arbeitsverzeichnis gesucht (und natürlich nicht gefunden).
Probiers evtl. mal so:
<?php unlink('/var/www/html/doc/43772027_1.pdf'); ?>
Oder mit einer Abfrage, ob die Datei auch tatsächlich gelösch wurde:
<?php
if(unlink('/var/www/html/doc/43772027_1.pdf')){
echo "/var/www/html/doc/43772027_1.pdf gelöscht.\n";
} else {
echo "/var/www/html/doc/43772027_1.pdf nicht gelöscht.\n";
}
?>
Der Daemon führt PHP aus, PHP führt das Skript aus, das Skript führt den Löschvorgang aus (bzw. versucht ihn auszuführen.).
Da allerdings das Arbeitsverzeichnis zwischendrin nicht gewechselt wird, bleibt dieses bei / (oder was auch immer für CRON konfiguriert wurde).
Sollte eigentlich...
Mir ist aber grad noch was am CRON-Log aufgefallen: Offenbar wird nicht, wie erwartet der Befehl
/usr/bin/php/7.0 /var/www/html/doc/delete.php &> /var/www/html/doc/error.log
ausgeführt sondern stattdessen
root /usr/bin/php/7.0 /var/www/html/doc/delete.php &> /var/www/html/doc/error.log
Soll heißen: CRON versucht offenbar einen Befehl namens root auszuführen und übergibt diesem /usr/bin/php/7.0 und /var/www/html/doc/delete.php als Argumente. Hast du den CRON-Job evtl. mit crontab -e angelegt? Falls ja, lass das root weg.
Wie genau bzw. wo genau hast du denn den CRON-Job erstellt? Mit crontab -e? Oder in einem der /etc/cron.* Ordner?
Falls ersteres: Hast du es mal ohne den Zusatz root vor dem Befehl versucht?
Und gibt es im CRON-Log irgendwelche Dinge, die zum Zeitpunkt deiner ersten Tests noch nicht da waren?
crontab -e sieht so aus übrigens:
MAILTO=""
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
#57 12 * * * root /usr/bin/php /var/www/html/doc/delete.php &> /var/www/html/doc/error.log
26 13 * * * /usr/bin/php/7.0 /var/www/html/doc/delete.php >> /var/www/html/doc/error.log 2>&1
Seltsam... Sollte eigentlich funktionieren...
Teste ggf. mal ob das direkt im Terminal funktioniert:
cd /
/usr/bin/php/7.0 -d display_errors=on -d error_reporting=2039 /var/www/html/doc/delete.php
Habe es nun erst probieren können. War erstens der falsche Pfad zu php aber danach ist nicht mehr passiert. Es hieß nur: -bash: /etc/php/7.0: Is a directory
WTF? /etc/php/7.0? Ist /usr/bin/php/7.0 evtl. ein Symlink auf /etc/php/7.0?
Auf jeden Fall solltest du erstmal den korrekten Pfad zum PHP-Interpreter finden.
Ist es evtl. /usr/bin/php, /bin/php, /usr/bin/php7.0 o.ä.?
Falls nicht, probier eins (oder mehrere) von denen (im Terminal):
which php
whereis php
find /usr/bin /bin -type f -name '*php*'
Habe jetzt das mit Abfrage genommen und es steht nichts in der error.log. Noch nicht einmal die PHP-Ausgabe.
Dann versuchs evtl. mal mit diesem CRON-Job:
30 11 * * * root /usr/bin/php/7.0 /var/www/html/doc/delete.php >> /var/www/html/doc/error.log 2>&1
Die PDF-Datei existiert schon einmal und liegt mit der delete.php in einem Ordner
und liegt mit der delete.php in einem Ordner
Und das ist das Problem. Im Skript hast du einen relativen Pfad. Dieser verhält sich relativ zum aktuellen Arbeitsverzeichnis. Und das ist (wahrscheinlich) /. Ausser wenn CRON ggf. anders konfiguriert wurde.
Bist du dir sicher das dein Pfad stimmt zu php?
Auf meinem System ist z.B. der richtige Pfad
/usr/bin/php7.0
anstatt
/usr/bin/php/7.0
wie bei dir.
BTW: root solltest du im Cronjob weglassen.
z.B.:
30 11 * * * /usr/bin/php7.0 /var/www/html/doc/delete.php ...
In der Error.log Datei steht übrigens nichts
Außerdem führt das ja gar nicht der Daemon aus sondern das PHP-Skript??