Ausführen eines SH-Skripts vom Cron aus

12

Ich habe ein test.sh-Skript

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

Wenn ich die Datei als root von der Kommandozeile aus ausführe, funktioniert es.

sh /home/v/test.sh 

wenn ich es auf crontab -e setze (ist das root cron), funktioniert es nicht

 * * * * * sh /home/v/test.sh

Was mache ich falsch? Vielen Dank

Elzo Valugi
quelle
"funktioniert nicht" funktioniert nicht. Sehen? Sie wissen nicht, was ich meine, und genau wie wir wissen nicht, was Sie meinen. Ich meine (ja) was funktioniert nicht? Könnte über alles sein. Könnte sein, dass meine Vermutung richtig ist, aber es ist nur eine Vermutung (und ziemlich gut, denke ich, aber immer noch).
Jürgen A. Erhard
Ja, wenn Sie genauer wissen, welche Ergebnisse Sie sehen, können wir das Problem besser ermitteln. Dh, was meinst du mit "nicht arbeiten" (:
gabe.
Ich sehe kein Protokoll im Syslog, und die Skripte führen einige Einfügungen in eine Datenbank durch, die nicht vorkommen, und sie passieren, wenn ich das Skript von Hand ausführe.
Elzo Valugi

Antworten:

15

Nach dem Mann:

Der Cron-Daemon startet eine Subshell aus Ihrem HOME-Verzeichnis. Wenn Sie die Ausführung eines Befehls planen, wenn Sie nicht angemeldet sind und Befehle in Ihrer .profile-Datei ausführen möchten, muss der Befehl Ihre .profile-Datei explizit lesen.

Der Cron-Dämon stellt für jede Shell eine Standardumgebung bereit, in der HOME, LOGNAME, SHELL (= / usr / bin / sh)
und PATH (= / usr / bin) definiert sind.

Daher weiß cron daemon nicht, wo sich PHP befindet, und Sie sollten den vollständigen PHP-Pfad zum Beispiel von Hand angeben (ich kenne Ihren tatsächlichen PHP-Pfad nicht):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Eine andere Möglichkeit besteht darin, zum Beispiel die Datei / etc / profile (oder Ihr .profile / .bashrc) zu verwenden

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Dies ist nützlich, wenn Ihre .bashrc-Datei die Umgebungsvariablen festlegt, die Sie benötigen (z. B. PATH).

BEARBEITEN

Eine interessante Lektüre ist " Newbie: Intro to cron ", unterschätzen Sie nicht den Artikel aus dem Titel (Es ist eine Lektüre für alle), in der Tat ist es gut vollständig geschrieben und beantwortet Ihre Frage perfekt:

...
PATH enthält die Verzeichnisse, die sich im Suchpfad für cron befinden. Wenn Sie z. B. ein Programm 'foo' im Verzeichnis / usr / cog / bin haben, ist es möglicherweise sinnvoll, / usr / cog / bin zum Verzeichnis hinzuzufügen Pfad, da Sie nicht jedes Mal den vollständigen Pfad zum 'Foo' verwenden müssen, wenn Sie ihn aufrufen möchten.
...

mähen
quelle
Bad $ PATH ist die häufigste Ursache für Skripte, die von Hand ausgeführt werden, jedoch nicht von cron.
Patrick
@Patrick Natürlich ist es ein Problem, wenn cron nicht weiß, wo PHP ist, sonst würde die Elzo crontab ohne Probleme funktionieren, es MUSS ein PATH-Problem sein.
Am
Vielen Dank für Ihre Antwort. Es hat bei mir sehr leicht geklappt !!! .. Vielen Dank @tmow.
Vignesh Prajapati
5

Es gibt vier häufige Ursachen für Befehle, die bei der Eingabe in ein Terminal, jedoch nicht von cron, in der angegebenen Reihenfolge ausgeführt werden:

  1. Cron bietet eine begrenzte Umgebung, z. B. ein Minimum $PATH, und andere erwartete Variablen fehlen.
  2. Cron ruft standardmäßig / bin / sh auf, während Sie möglicherweise eine andere Shell interaktiv verwenden.
  3. Cron behandelt das% -Zeichen speziell (es wird im Befehl in eine neue Zeile umgewandelt).
  4. Cron bietet kein Terminal oder eine grafische Umgebung.

Wenn Ihr Auftrag eine Ausgabe, einschließlich Fehlermeldungen, erzeugt, sendet Ihnen cron eine E-Mail mit der gesamten Ausgabe. Stellen Sie sicher, dass Sie die E-Mail lesen, die Sie lokal erhalten, oder leiten Sie sie an eine von Ihnen gelesene Adresse weiter. Geben Sie die andere Adresse ein, um E-Mails von einem lokalen Konto an eine andere Adresse weiterzuleiten ~/.forward. Wenn der Cron - Job als Systembenutzer ausgeführt wird ( root, webmaster, ...), stellen Sie sicher , dass der Benutzer Mail an Sie weitergeleitet wird (und jede andere admin); Setzen Sie bei den meisten Mail-Setups Zeilen wie root: elzoin /etc/aliases.

Gilles 'SO - hör auf böse zu sein'
quelle
2

Der Cron-Daemon führt Ihren Befehl normalerweise in einer Shell aus, in der die Umgebungsvariable PATH auf bestimmte Systemstandards beschränkt ist, z. B. / usr / bin: / bin.

Wahrscheinlich ist Ihr phpBefehl in / usr / bin oder / bin nicht verfügbar, und daher schlägt das Skript fehl, wenn es über cron ausgeführt wird, und wird erfolgreich ausgeführt, wenn es nicht ausgeführt wird.

Cron meldet normalerweise Fehler oder Jobmeldungen per E-Mail an den Root-Benutzer (dh wenn ein Befehl einen Exit-Status zurückgibt! = 0 oder eine Ausgabe an stdout / stderr erzeugt), nachdem der Job beendet ist.

Abhängig von Ihrem System müssen Sie die lokale E-Mail-Zustellung einrichten, um diese Nachrichten zu erhalten.

maxschlepzig
quelle