Warum hat meine Crontab nicht ausgelöst?

29

Ich habe crontab -emeiner Crontab die folgende Zeile hinzugefügt:

* * * * * echo hi >> /home/myusername/test

Ich sehe jedoch nicht, dass in die Testdatei geschrieben wurde. Handelt es sich um ein Berechtigungsproblem oder funktioniert Crontab nicht ordnungsgemäß?

Ich sehe, dass der Cron-Prozess ausgeführt wird. Wie kann ich das debuggen?

Edit - Ask Ubuntu hat eine nette Frage zu crontab , leider hilft mir das immer noch nicht weiter.

Edit 2 - Hmm, meine Testdatei scheint 214 Zeilen zu haben, was bedeutet, dass in den letzten 214 Minuten jede Minute darauf geschrieben wurde. Ich bin nicht sicher, was das Problem war, aber es ist offensichtlich weg.

ripper234
quelle

Antworten:

23

Es gibt Implementierungen von cron(nicht alle von ihnen, und ich weiß nicht mehr, welche, aber ich bin auf eine unter Linux gestoßen), die jede Minute nach aktualisierten crontab-Dateien suchen und neue Einträge erst in der nächsten Minute berücksichtigen . Daher kann es bis zu zwei Minuten dauern, bis eine Crontab zum ersten Mal gestartet wird. Dies ist möglicherweise das, was Sie beobachtet haben.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Ich würde Solaris oder vielleicht früher Solaris raten. Ich habe die Angewohnheit, den Cron-Eintrag in der Zukunft 3-5 Minuten laufen zu lassen, wenn ich ein Skript aus einem Crontab-Eintrag teste, weil ich mich die ganze Zeit über dieses Verhalten täuschen ließ.
Bruce Ediger
fcrontut dies auch.
Phunehehe
Was ist, wenn die "Check" -Routine mehr als ein paar Minuten dauert? Es wird Cronjobs geben, die während dieser langen "Prüfung" ausgelöst werden sollten, die nicht ausgelöst wurden.
ospider
@ospider Die Prüfung dauert nur einen Bruchteil einer Sekunde.
Gilles 'SO- hör auf böse zu sein'
28

Haben Sie nach Ihrem Cronjob eine Leerzeile hinzugefügt ?

gelraen
quelle
Nach meinem Cronjob ist eine leere Zeile.
Ripper234
4
Keine leere Zeile, sondern eine neue Zeile am Ende der letzten Zeile. Eine Textdatei soll aus einer Folge von Zeilen bestehen, die jeweils durch eine neue Zeile abgeschlossen werden. Eine nicht leere Textdatei endet also mit einem neuen Zeilenzeichen. Einige Dienstprogramme verarbeiten nach dem letzten Zeilenumbruch in einer Datei nichts mehr.
Gilles 'SO- hör auf böse zu sein'
1
Dies ist eine Frage der Begriffe, "Zeilenumbruch" bedeutet "nach diesem Zeichen eine neue Textzeile beginnen". 0 Bytes zwischen der letzten Newline und EOF können daher auch als Leerzeile ("Zeile, die 0 Zeichen enthält") betrachtet werden
Gelraen
10

Ich hatte das gleiche Problem - eine funktionierende Crontab stoppte plötzlich, nachdem ich am Ende einen neuen Eintrag hinzugefügt hatte. Es stellte sich heraus, dass ich vergessen hatte, nach dieser letzten Zeile eine neue Zeile einzufügen.

Ich fand heraus, indem ich den Befehl ausgab

cat /var/log/syslog | grep crontab

und die Ausgabe zeigte das Problem:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

Das Hinzufügen der neuen Zeile und das Speichern haben das Problem behoben.

uniomni
quelle
5

Klingt so, ist behoben. Versuchen Sie beim nächsten Mal, auch den STDERR zu protokollieren. Folgendes wird nur in STDOUT und nicht in STDERR protokolliert:

* * * * * echo hi >> /home/myusername/test

Stellen Sie sicher, dass es auch eine explizite Klausel für STDERR gibt. Andernfalls wird STDERR möglicherweise per E-Mail an den Benutzer gesendet (vorausgesetzt, die E-Mail funktioniert), oder es kommt auf keinen Fall darauf an, wie Cron konfiguriert ist.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

Ich bevorzuge es, eine Cronjob-Ausgabe an Syslog zu senden. Auf diese Weise nutze ich jede vorhandene Syslog-Infrastruktur (zentralisierte Syslogs, Splunk, bereits unterstützte Protokollrotation, einfacher Vergleich von Nachrichten in / var / log / messages & / var / log / cronjob usw.) und nicht die Sysadmins (mich) mit unnötigen E-Mails zu spammen.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob
Stefan Lasiewski
quelle
2

Bei mir bestand das Problem darin, dass das Skript nicht ausführbar war. Ich hatte Crontab-e- Setup wie folgt

* * * * * /bin/my-script.sh

Und die Datei myscript war nicht ausführbar, also lief ich

chmod +x my-script.sh

Sofort sah ich die erwartete Ausgabe.

Santiago Arizti
quelle
1

Ihre Cron - Linie funktioniert auf meinem Computer , wenn ich ändern myusernaezu phunehehe. Es gibt verschiedene Möglichkeiten, um herauszufinden, was mit Ihrem System nicht stimmt.

Cron sendet normalerweise eine E-Mail an den Benutzer, wenn etwas nicht stimmt. Wenn die Meldung "Sie haben E-Mail" angezeigt wird, überprüfen Sie Ihren Posteingang mit einem E-Mail-Client . Oder überprüfen Sie in Ihrem Home-Verzeichnis, ob dort eine Datei mit dem Namen dead.lettervorhanden ist.

Sie können /var/log/nach Einträgen in Bezug auf cron suchen. Auf meinem Computer befindet sich die Protokolldatei unter /var/log/cron/current(Root-Zugriff erforderlich).

Wenn Sie Root-Zugriff haben, können Sie den Cron-Daemon stoppen und im Debug-Modus starten. Zum Beispiel würde ich verwenden (ändern Sie fcronden Namen Ihres Daemons):

killall fcron
fcron --foreground --debug
phunehehe
quelle
Wie finde ich den Namen meines Daemons heraus?
Ripper234
@ ripper234 benutzen ps -ef | grep cronund du solltest eine Zeile für deinen Cron sehen. Überprüfen Sie die Manpage des Cron, um das Flag für das Debuggen zu sehen. Es ist wahrscheinlich, dass Sie Vixie Cron verwenden . In diesem Fall lautet das Debug-Flag -x. Beenden Sie den Cron-Prozess und starten Sie ihn erneut mit dem zusätzlichen Flag.
Phunehehe
Überprüfen Sie auch / var / log / syslog. In meinem Fall gab es Warnungen, dass die Cron-Datei gruppenbeschreibbar war.
Behandle deine Mods gut
1

Wenn cron fehlschlägt, wird höchstwahrscheinlich eine E-Mail an die Benutzer-ID des Cron-Jobs auf diesem Computer generiert. Wenn auf Ihrem Computer kein MTA ausgeführt wird oder Sie diese E-Mail nicht an einem anderen Ort lesen oder weiterleiten, wird diese Nachricht auch dann nicht angezeigt, wenn der MTA ausgeführt wird.

Eine gute Möglichkeit, die Fehler Ihres Crontab per E-Mail zu erhalten, besteht darin, Ihr Crontab folgendermaßen aussehen zu lassen:

MAILTO="[email protected]"
* * * * * echo hi >> /home/myusernae/test

Verwenden Sie natürlich Ihre E-Mail-Adresse anstelle von [email protected]. Dies weist cron an, Fehler an Ihre E-Mail-Adresse und nicht an das lokale Konto zu senden. Dies ist insbesondere dann nützlich, wenn Sie eine Root-Crontab (oder ein Crontab-Fragment in /etc/cron.d) haben, die Sie nur als Ausgabe an Sie senden möchten. Sie können vermeiden, das Postfach von Root oder die Weiterleitungsadresse von Root zu spammen.

jsbillings
quelle
Ich weiß nicht, ob auf dem System ein SMTP- / Postausgangsserver konfiguriert ist. Wahrscheinlich nicht.
Ripper234
1

Ich denke, ein Grund dafür könnte sein, dass das / home / -Verzeichnis verschlüsselt ist und wenn der Benutzer abgemeldet ist, cron nichts in diesem Verzeichnis tun kann.

Siehe: https://stackoverflow.com/a/40354269/1279002

theINtoy
quelle