it-swarm.com.de

php /var/www/html/*.php funktioniert nicht in einem Terminal, das über das Menü geöffnet wird

Ich möchte ein PHP Skript von cron ausführen. Ich richte cron ein mit:

*/1 * * * * php  /var/www/html/cron/cron_job.php

Und ich kann es in crontab -u root -l sehen, aber der Job wird nicht ausgeführt. Es funktioniert auch nicht, wenn ich den Befehl direkt über die Befehlszeile wie folgt ausführe:

<?php  /var/www/html/cron/cron_job.php

Ich habe viele Antworten in Bezug auf cron ausprobiert, aber nichts hat funktioniert. Zum Beispiel:

/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
Sudo php -f /var/www/html/cron/cron_job.php

Das PHP-Skript zum Testen (cron_job.php) lautet:

php file_put_contents  ('test.txt',"test content\n",FILE_APPEND);  

Die Dateiberechtigungen sind alle in Ordnung und funktionieren, wenn sie im Browser ausgeführt werden oder wenn ein Terminal in /var/www/html/cron/ geöffnet und php cron_job.php ausgeführt wird.

Wenn ich, wie in den Kommentaren gefordert, 2> /tmp/php.log an php /var/www/html/cron/cron_job.php anhänge, ein Skript mit einem Syntaxfehler verwende und versuche, (php /var/www/html/cron/cron_job.php 2> /tmp/php.log) vom Menü-Terminal aus auszuführen, erhält das Fehlerprotokoll die Fehlermeldung .

4
Naga

Ihr Skript wird mit ziemlicher Sicherheit ausgeführt und erstellt Ihre Datei. Es wird nur nicht dort erstellt, wo Sie es erwarten. Sie verwenden keinen Pfad in Ihrem Skript, sondern nur einen Dateinamen. Dies bedeutet, dass die Datei in dem Verzeichnis erstellt wird, in dem das Skript ausgeführt wird.

Wenn Sie in ein bestimmtes Verzeichnis wechseln und dort das Skript ausführen, denken Sie, dass dies funktioniert. Da die Datei in dem Verzeichnis erstellt wird, in dem Sie sie ausgeführt haben, können Sie sie sehen. Standardmäßig wird cron im Ausgangsverzeichnis des Benutzers ausgeführt, der es ausführt. Da dies die crontab von root ist (was übrigens eine schlechte Idee ist), wird die Datei in /root erstellt. Also, schau nach:

Sudo ls /root/test.txt

Geben Sie Ihrem Skript also beim nächsten Mal einen vollständigen Pfad anstelle eines Dateinamens:

<?php file_put_contents  ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>

Jetzt wird die Datei in /path/to erstellt.

11
terdon

Standardmäßig werden Cron-Jobs im Basisverzeichnis des Benutzers ausgeführt. Während in Ihrem Skript kein Pfad für die zu speichernde Ausgabedatei angegeben ist, wird diese in dem Verzeichnis gespeichert, in dem das Skript ausgeführt wird.

In Ihrem PHP fehlt der Pfad zur Datei test.txt. Sie können ihn als absoluten Wert festlegen, wie er in @ terdons answer beschrieben ist, oder Sie können ihn als relativen Pfad angeben (mit korrektem Ursprung). Wenn sich beispielsweise test.txt im selben Verzeichnis wie cron_job.php befinden soll, sollte der Inhalt Ihres Skripts ungefähr so ​​aussehen:

<?php 
    $path = realpath(dirname(__FILE__)); 
    file_put_contents  ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>

Wenn Sie das Skript nicht ändern möchten, können Sie den Cron-Job auch folgendermaßen ändern:

*/1 * * * * cd /var/www/html/cron/ && php cron_job.php
6
pa4080