Warum wird mein Job "cron.d per minute" nicht ausgeführt?

33

Ich habe ein paar Pfeile geworfen, um zu versuchen, dass ein Python-Skript von mir jede Minute ausgeführt wird. Also dachte ich, ich würde es vereinfachen, um einfach einmal pro Minute das "Einfachste, was funktionieren könnte" zu machen (ich starte debian / testing).

Ich habe eine einzeilige Datei erstellt in /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

Es gehört root und ist ausführbar (nicht sicher, ob dies eine Rolle spielt). Und dann habe ich getan:

sudo service cron reload

Und dann lehne dich zurück und starte ls -ltrimmer wieder in meinem Homeverzeichnis ( /home/me). Aber meine ding_dong-Datei wird nie angezeigt. Ich weiß, wenn ich a tue sudo /bin/touch /home/me/ding_dong, zeigt es sich sofort.

Offensichtlich fehlt hier etwas Dummes.

Travis Griggs
quelle
3
Ein erneutes Laden des Cron-Daemon-Dienstes, um eine Änderung in cron.d zu übernehmen, ist normalerweise nicht erforderlich, da das Verzeichnis ohnehin jede Minute nach neuen und aktualisierten Dateien durchsucht wird.
Josip Rodin

Antworten:

45

Wenn Sie eine Cron-Konfiguration in /etc/cron.d/oder in /etc/crontabhinzufügen, müssen Sie den Benutzernamen hinzufügen, in dem der Befehl in Ihrem Beispiel ausgeführt werden soll

* * * * * root /bin/touch /home/me/ding_dong

Und nur ein Hinweis von mir: Sie müssen nicht ls -ltrimmer wieder loslegen. Verwenden watch -n 5 "ls -ltr"Sie einfach und der Befehl wird alle 5 Sekunden ausgeführt (oder jeder andere Wert, indem Sie 5 durch den gewünschten Wert ersetzen).

Noggerl
quelle
9
Das brachte mich in die richtige Richtung. Es war ein herrlicher Moment. Ich habe es behoben und trotzdem hat es nicht funktioniert. Nachdem ich man cronetwas langsamer gelesen und den DEBIAN specificAbschnitten besondere Aufmerksamkeit geschenkt hatte , bemerkte ich, dass die Dateien NICHT gruppen- oder beschreibbar sein dürfen. Was ich an einem Punkt in meiner Frustration aktiviert hatte.
Travis Griggs
Könnten Sie nicht auch einfach den Eigentümer des Skripts in root ändern?
Geremia
Diese spezielle Linie hat mir geholfen. Von man cron: Außerdem liest cron in Debian die Dateien im Verzeichnis /etc/cron.d. cron behandelt die Dateien in /etc/cron.d genauso wie die Datei / etc / crontab (sie folgen dem speziellen Format dieser Datei, dh sie enthalten das Benutzerfeld ). Sie sind jedoch unabhängig von / etc / crontab: Sie erben beispielsweise keine Einstellungen für Umgebungsvariablen. Diese Änderung ist Debian-spezifisch, siehe den Hinweis unter DEBIAN SPECIFIC unten.
Harperville
man 8 cron (unter Debian) sagt auch, dass Dateien in /etc/cron.d/ nur alphanumerische Zeichen enthalten dürfen, '-' und '_'. Insbesondere keine Punkte.
Partel
3

Um einen neuen cronJob zu erstellen , sollten Sie crontab -eals der Benutzer ausgeführt werden, der den Job ausführen soll . Fügen Sie dann die entsprechende Zeile in das erscheinende Editorfenster ein:

* * * * * /bin/touch /home/me/ding_dong

Die Art und Weise, wie Sie dies tun, erfordert ein anderes Format und ist sowieso keine gute Idee. Crontabs in /etc/cron.dhaben ein etwas anderes Format. Sie benötigen einen Benutzernamen, unter dem sie ausgeführt werden. Zum Beispiel:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Ein guter Trick (wie von @VogonPoetLaureate vorgeschlagen) besteht darin, den Standardfehler Ihrer Cron-Jobs zu erfassen, der beim Debuggen hilfreich sein kann. Zum Beispiel:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error
terdon
quelle
6
Es gibt absolut keinen Grund zu sagen, dass cron.d "keine gute Idee" ist. Der Cron-Daemon sendet die Ausgabe von cron.d stderr an den Benutzernamen. Wenn Sie diese an eine andere E-Mail-Adresse umleiten möchten, ist die Variable MAILTO verfügbar.
Josip Rodin
@JosipRodin ist keine gute Idee für Dinge, die nicht von root ausgeführt werden und die von Ihnen eingerichtet wurden. Für einen Sysadmin auf einem Mehrbenutzersystem ist es sinnvoll, aber auf Ihrem eigenen Computer ist es einfacher, alles auf Ihrer eigenen crontab zu haben, sodass nur ein Ort zum Überprüfen und crontab -lAuflisten aller Ihrer Cron-Jobs vorhanden ist.
Terdon
Dies setzt voraus, dass es sich nur um einen persönlichen Cron-Job handelt, den das OP nicht wirklich geklärt hat. Im Allgemeinen gibt es zahlreiche Anwendungen für nicht privilegierte Benutzer-Cron-Jobs, die über cron.d eingerichtet wurden beschlagnahmt Service-Benutzer, automatisierte Bereitstellung ist einfacher, etc.
Josip Rodin
@ JosipRodin absolut. Ich nahm ein persönliches System an, weil i) Unternehmenssysteme hier nicht zum Thema gehören und ii) die Frage einen nicht sachkundigen Benutzer vorschlug.
Terdon
OK, ich schätze, ich lese nicht mehr in das wegen der allgemeinen Verwechslung zwischen Superuser und Serverfault und Unix SE-Sites :)
Josip Rodin
2

Ein möglicher Fehler ist hier, wie eine einzelne Zeilendatei erstellt wird. Aus der Ubuntu-Dokumentation :

... Zeile enthält fünf Zeit- und Datumsfelder, gefolgt von einem Befehl und einem Zeilenumbruchzeichen .

Zum Beispiel funktioniert diese Art der Erstellung nicht:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
okoloBasii
quelle