2009-02-28 7 views
2

Wenn ich ein Skript von /home/<user>/<dir>/script.sh als root ausführen, funktioniert das Cron ziemlich gut. Aber wenn ich das Skript von /root/<dir>/script.sh (als root, wieder) ausführen, scheint das Cron nicht zu funktionieren.Cron läuft nicht von/root

+0

ohne den Code ausführen, wird es schwierig bekommen ;-) –

+0

ja, müssen wir den Code, und wir brauchen genau zu wissen, wie es nicht funktioniert. –

Antwort

2

Ich denke, Sie müssen ein wenig mehr Informationen hinzufügen. Ich denke, es ist eine Erlaubnis Sache obwohl. Fügen Sie die Berechtigungen der Datei, der Verzeichnisse und der Zeile in Ihrer Crontab hinzu, damit wir Ihnen helfen können. Wenn Sie dies in/root tun, führen Sie dies in root's crontab aus?

0

Es könnte sein, weil Sie nach relativen Verzeichnissen/Dateien im Skript suchen, die bei der Ausführung von/home/aber nicht von/root gefunden werden, weil/root nicht in/home/root ist und auch nicht aussehen würde Wie ein Benutzer homefolder in/home/

Können Sie überprüfen, ob es nach relativen Dateien sucht, oder das Skript posten?

In einem anderen Hinweis, warum Sie es nicht einfach so einrichten, aus dem Homefolder eines Benutzers auszuführen?

2

Denken Sie an die Umgebung - besonders wenn sie von cron statt von root ausgeführt wird. Wenn Cron etwas ausführt, haben Sie wahrscheinlich nicht viel von Ihrer Umgebung, anders als wenn Sie einen Befehl über at ausführen. Es ist auch nicht klar, was Ihr aktuelles Verzeichnis sein wird. Also, für Befehle, die von cron ausgeführt werden, verwenden Sie ein Skript (wie Sie bereits tun) und stellen Sie sicher, dass es genug der Umgebung für die Ausführung setzt. Stellen Sie sicher, dass der Code für die Umgebungseinstellung nicht interaktiv ist.

Auf meinem Rechner habe ich einen Mechanismus, so dass der cron-Eintrag liest (zum Beispiel):

23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday 

Das weekday Skript im Cron Verzeichnis ein Link zu einem Standard-Skript, das zuerst die Umwelt setzt und Dann wird der Befehl /work1/jleffler/bin/weekday ausgeführt (in diesem Fall - es verwendet den Namen des Befehls, um zu bestimmen, was ausgeführt werden soll).

Das eigentliche Skript im Cron Verzeichnis ist:

:  "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $" 
# 
#  Commands to be performed by Cron (no debugging options) 

#  Set environment -- not done by cron (usually switches HOME) 
. $HOME/.cronfile 

base=`basename $0` 
cmd=${REAL_HOME:-/real/home}/bin/$base 

if [ ! -x $cmd ] 
then cmd=${HOME}/bin/$base 
fi 

exec $cmd ${@:+"[email protected]"} 

Ich habe es schon eine Weile jetzt mit - dieser Version seit 2001 - und es funktioniert für mich einen Genuss. Ich verwende eine grundlegende (Sun Solaris 10) Implementierung von cron; Es kann neue Funktionen in neuen Versionen von cron auf anderen Plattformen geben, um einige davon überflüssig zu machen. (Das $REAL_HOME Zeug ist eine seltsame von mir; tue es so, sagt $HOME - obwohl das macht einige der Skript für Sie unnötig.) Die .cronfile ist verantwortlich für die Einstellung der Umgebung - es tut ziemlich viel, aber das ist mein Problem, nicht deins.

3

Nachdem ich in der Vergangenheit bei der Verwendung von 'cron' auf verschiedene Standard $ PATHs gestoßen bin, buchstabiere ich immer den absoluten $ PATH für jede ausführbare Datei und jede Zieldatei. Ich nehme immer an, dass 'cron' NO $ PATH gesetzt hat und KEIN current-working-directory hat.

Mit anderen Worten nicht mit einem Befehl wie

 "myprocess abc*.txt" 

aber es vollständig tun wie

 "/usr/localbin/myprocess /home/jvs/abc*.txt". 

Alternativ erstellen Sie einen Bash-Skript, das die Arbeit erledigt, und nennt den Bash-Skript B.

 "/usr/local/bin/myprocess_abc_txts". 

Wenn Sie etwas Flexibilität im Skript benötigen, verwenden Sie env ironment-Variablen, die speziell in dem Bash-Skript gesetzt werden, das Sie mit 'cron' aufrufen.

0

Ein anderer Weg sh Skript auszuführen ist in /usr/bin Verzeichnis Ihr Bash-Skript platzieren und einfach Befehl bash yourscript.sh ohne Zusatz /usr/bin/ Verzeichnis