Cronjob wird nicht richtig ausgeführt?

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.

Woher ich das weiß:Berufserfahrung

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";
    }
?>

maxik5899 
Fragesteller
 27.06.2018, 12:37

Die PDF-Datei existiert schon einmal und liegt mit der delete.php in einem Ordner

0
Isendrak  27.06.2018, 13:13
@maxik5899
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.

0
maxik5899 
Fragesteller
 27.06.2018, 12:40

Habe jetzt das mit Abfrage genommen und es steht nichts in der error.log. Noch nicht einmal die PHP-Ausgabe.

0
Isendrak  27.06.2018, 13:18
@maxik5899

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
0
maxik5899 
Fragesteller
 27.06.2018, 12:55

Außerdem führt das ja gar nicht der Daemon aus sondern das PHP-Skript??

0
Isendrak  27.06.2018, 13:15
@maxik5899

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).

0
maxik5899 
Fragesteller
 27.06.2018, 13:18
@Isendrak

Ich habe danach immer die Error.log gecheckt. Sollte da das Echo dann nicht drin stehen?

0
Isendrak  27.06.2018, 13:23
@maxik5899

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.

1
maxik5899 
Fragesteller
 27.06.2018, 13:27
@Isendrak

in der error.log steht trotzdem leider immer noch nichts. Schreibrechte und so sind auch vergeben

0
Isendrak  27.06.2018, 13:32
@maxik5899

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?

0
maxik5899 
Fragesteller
 27.06.2018, 13:34
@Isendrak

ich erstelle sie mit crontab -e und habe das root jetzt auch mal weg gelassen aber es hat trotzdem nicht funktioniert.

Wie meinst du das mit dem Log? Da war nichts auffälliges

0
maxik5899 
Fragesteller
 27.06.2018, 13:34
@maxik5899

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

0
Isendrak  27.06.2018, 13:43
@maxik5899

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
0
maxik5899 
Fragesteller
 27.06.2018, 15:40
@maxik5899

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

0
Isendrak  27.06.2018, 16:11
@maxik5899

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*'
1
maxik5899 
Fragesteller
 27.06.2018, 16:51
@Isendrak

hab jetzt mal nur php vorgesetzt und jetzt klappt es

0

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