Cron-Skript wird auf Mavericks nicht ausgeführt

12

Ich habe eine Benutzer-Crontab-Datei wie folgt konfiguriert:

*/2 * * * * /Users/[my user]/Dropbox/htdocs/auto-update.sh

Aber es wird nicht ausgeführt. Ich wartete ungefähr 10-15 Minuten. Warum?

Der Befehl auto-update.sh wird problemlos ausgeführt, wenn er manuell ausgeführt wird. Wie kann ich die Ausführungskette aufteilen und mein Skript von cron zum Laufen bringen?

RomaValcer
quelle
1
Welches Betriebssystem verwenden Sie? Cron ist unter OS X veraltet, sodass Sie möglicherweise den Daemon starten müssen.
bmike
Spätestens 10.9.2. Wie mache ich es? Ich möchte nur, dass zum Beispiel jede Stunde ein Skript funktioniert. Im obigen Skript war ich verzweifelt, weil es nicht funktioniert hat, und habe es so geändert, dass es alle 2 Minuten funktioniert.
RomaValcer
1
Der Cron-Daemon sollte automatisch gestartet werden (durch Ersetzen, Starten), wenn eine Crontab-Datei vorhanden ist. Siehe /System/Library/LaunchDaemons/com.vix.cron.plist (insbesondere die KeepAliveund -Elemente QueueDirectories).
Gordon Davisson
OK, Keeplive ist da, aber nur der dort aufgeführte Pfad ist '/ etc / crontab', der nicht existiert. In QueueDirectories befindet sich eine Datei im eingeschränkten Ordner '/ usr / lib / cron / tabs'. Beim Öffnen mit su und vim gibt es meine Aufgabe.
RomaValcer

Antworten:

17

Die Umgebung, in der ein Cron-Job ausgeführt wird, unterscheidet sich erheblich von einer interaktiven Shell. Es ist wahrscheinlich, dass das Skript ausgeführt wird, aber nicht erfolgreich. Einer der größten Unterschiede besteht darin, dass für Cron-Jobs der Standardpfad nur "/ usr / bin: / bin" lautet. Wenn Sie also Befehle verwenden, die nicht in / usr / bin oder / bin enthalten sind, ist dies nicht der Fall gefunden, es sei denn, Ihr Skript legt entweder einen eigenen Pfad fest oder liefert explizite Pfade zu Befehlen. Der andere große Unterschied besteht einfach darin, dass es nicht mit einer interaktiven Sitzung verbunden ist. Wenn also versucht wird, etwas Interaktives (Lesen vom Terminal usw.) auszuführen, schlägt dies fehl. Versuchen Sie, den Cron-Eintrag in zu ändern:

*/2 * * * * /Users/[my user]/Dropbox/htdocs/auto-update.sh >>/tmp/auto-update.log 2>&1

... und prüfen Sie, ob im Protokoll etwas Informatives angezeigt wird.

Gordon Davisson
quelle
Dies ist besser als meine Bemühungen - zögern Sie nicht, meine Logger-Idee einzubeziehen, wenn Ihre Antwort dadurch besser wird.
bmike
Das Protokoll wurde einfach nicht angezeigt.
RomaValcer
@RomaValcer: Das ist seltsam - es bedeutet, dass es nicht einmal so weit kommt, das Skript zu starten. Ich würde laufen ps -ax | grep [c]ronund sehen, ob der Cron-Daemon (/ usr / sbin / cron) aufgelistet ist. Wenn dies der Fall ist, versuchen Sie den Logger-Test von bmike. Überprüfen Sie in jedem Fall die Protokolle (/var/log/system.log und das Element "Alle Nachrichten" im Konsolendienstprogramm) und prüfen Sie, ob relevante Informationen vorhanden sind.
Gordon Davisson
Ja, es ist da. In Protokollen wird jedoch nichts angezeigt, was zur geplanten Zeit beginnt.
RomaValcer
4

Es ist schwer zu sagen, aber was ist, wenn Sie einen zweiten Cron-Job hinzugefügt haben, der etwa alle 5 Minuten ausgeführt wird, und ein vom System erstelltes Tool aufrufen, das Nachrichten in system.log protokolliert?

0,5,10,15,20 * * * * /usr/bin/logger "cron is working"

Auf diese Weise wissen Sie, dass cron für den betreffenden Benutzer ausgeführt wird, und können sich entweder darauf konzentrieren, cron zu starten oder Ihr Skript so zu reparieren, dass es in der eingeschränkten cron-Umgebung ausgeführt wird. (Sie können auf die Wanduhr schauen und einige Male auswählen, die bald oder sogar in den nächsten Minuten erscheinen werden - z. B. um 12:34 Uhr bearbeiten, 35,36,37,38 eingeben, damit die Minuten ausgeführt und die Cron-Datei gespeichert werden .)

bmike
quelle
4

Es ist eine Weile her, dass Sie diese Frage gestellt haben, aber es scheint, dass in diesem Thread keine Lösung gefunden wurde.

Abhängig von der Art und Weise, wie Sie eine Benutzer-Crontab erstellen, muss diese möglicherweise nach der Bearbeitung ausgeführt werden:

crontab ~/.yourcrontabfile

Um festzustellen, ob die neue Crontab (auch nach dem Ändern) aktiviert wurde, überprüfen Sie Folgendes:

crontab -l
Ben
quelle
Das geht nicht Crontab -l zeigt, dass Cron eingerichtet sind, aber es funktioniert immer noch nicht.
PKHunter
1

Ich hatte das gleiche Problem. Sie müssen den Pfad zu Ihrem Bash-Skript hinzufügen:

#!/bin/sh
PATH=/usr/local/bin:/usr/local/sbin:~/bin:/usr/bin:/bin:/usr/sbin:/sbin
Ivan Zhirkov
quelle
0

Ich hatte das gleiche Problem. Es ging weg, nachdem ich nach meinem Job eine neue Zeile in meine Crontab-Datei eingefügt hatte (ich bin ein totaler Crontab n00b, daher habe ich keine Ahnung, ob dieses Verhalten allgemein bekannt ist oder nicht).

RMD
quelle