Ich muss einen Cron-Job über ein Skript hinzufügen, das ich zum Einrichten eines Servers ausführe. Ich benutze derzeit Ubuntu. Ich kann verwenden, crontab -e
aber das öffnet einen Editor, um die aktuelle Crontab zu bearbeiten. Ich möchte dies programmgesteuert tun.
Ist das möglich?
Antworten:
Cron-Jobs werden normalerweise in einer Benutzerdatei unter gespeichert
/var/spool/cron
Am einfachsten ist es wahrscheinlich, eine Textdatei mit dem konfigurierten Job zu erstellen, diese dann in den Cron-Spool-Ordner zu kopieren und sicherzustellen, dass sie über die richtigen Berechtigungen verfügt (600).
quelle
Hier ist ein Einzeiler, der den neuen Job nicht in einer Datei verwendet / benötigt:
Das
2>/dev/null
ist wichtig , damit Sie nicht das bekommtno crontab for username
Nachricht , dass einige * nixes produzieren , wenn es derzeit keine crontab Einträge sind.quelle
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
Hoffentlich hilft dies jemandemFür Benutzer-Crontabs (einschließlich Root) können Sie Folgendes tun:
Dabei enthält die Datei mit dem Namen "Dateiname" Elemente zum Anhängen. Sie können die Textmanipulation auch mit
sed
einem anderen Werkzeug anstelle von durchführencat
. Sie sollten dencrontab
Befehl verwenden, anstatt die Datei direkt zu ändern.Eine ähnliche Operation wäre:
Wenn Sie System-Crontabs ändern oder erstellen, können diese wie normale Textdateien bearbeitet werden. Sie werden in den gespeicherten
/etc/cron.d
,/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weekly
,/etc/cron.monthly
Verzeichnissen und in den Dateien/etc/crontab
und/etc/anacrontab
.quelle
echo
) und bekam "crontab: Verwendungsfehler: Dateiname muss zum Ersetzen angegeben werden". Die Cron-Manpage zeigt die Syntax alscrontab [ -u user ] file
, dh mit einem obligatorischen Dateinamen. Gibt es einen Trick, um stattdessen die weitergeleiteten Daten zu akzeptieren?stdin
. Ich werde meine Antwort korrigieren.In Ubuntu und vielen anderen Distributionen können Sie einfach eine Datei in das
/etc/cron.d
Verzeichnis einfügen, das eine einzelne Zeile mit einem gültigen crontab- Eintrag enthält. Es ist nicht erforderlich, einer vorhandenen Datei eine Zeile hinzuzufügen.Wenn Sie nur etwas benötigen, das täglich ausgeführt werden soll, legen Sie einfach eine Datei ab
/etc/cron.daily
. Ebenso können Sie auch Dateien in fallen/etc/cron.hourly
,/etc/cron.monthly
und/etc/cron.weekly
.quelle
Eine noch einfachere Antwort auf Ihre Frage wäre:
Sie können Cronjobs auf Remote-Servern wie folgt einrichten:
Unter Linux ist der Standardspeicherort der
crontab
Datei/var/spool/cron/
. Hier finden Sie diecrontab
Dateien aller Benutzer. Sie müssen nur Ihren Cronjob-Eintrag an die Datei des jeweiligen Benutzers anhängen. Im obigen Beispiel wird die Crontab-Datei des Root-Benutzers mit einem Cronjob versehen, der/root/test.sh
jeden Tag um 1 Uhr morgens ausgeführt wird.quelle
/var/spool/cron/crontabs/root
auf Ubuntu.Crontab-Dateien sind einfach Textdateien und können als solche wie jede andere Textdatei behandelt werden. Der
crontab
Befehl dient dazu, das Bearbeiten von Crontab-Dateien sicherer zu machen. Bei der Bearbeitung mit diesem Befehl wird die Datei auf Fehler überprüft und nur gespeichert, wenn keine vorhanden sind.crontab [path to file]
kann verwendet werden, um eine in einer Datei gespeicherte Crontab anzugeben. Socrontab -e
wird die Datei nur installiert, wenn sie fehlerfrei ist.Daher kann ein Skript entweder direkt Cron-Tab-Dateien schreiben oder sie in eine temporäre Datei schreiben und mit dem
crontab [path to temp file]
Befehl laden . Das direkte Schreiben erspart das Schreiben einer temporären Datei, vermeidet aber auch die Sicherheitsüberprüfung.quelle
crontab [path to file]
dies der Fall ist . Dies war definitiv die beste Option für mich, da sie besser lesbaren Code ermöglicht. Ich verwende crontab, um Pakete zu verfolgen und mein Desktop-Hintergrundbild mit dem Status zu ändern. Wenn ich keine Pakete erwarte, muss es nicht jede Stunde überprüft werden. Aus diesem Grund wollte ich, dass das Skript die Cron-Frequenz automatisch bearbeitet.(Ich habe nicht genug Ruf, um einen Kommentar abzugeben, daher füge ich als Antwort hinzu: Fühlen Sie sich frei, ihn als Kommentar neben seiner Antwort hinzuzufügen.)
Der Einzeiler von Joe Casadonte ist perfekt, es sei denn, Sie arbeiten mit
set -e
, dh wenn Ihr Skript bei einem Fehler fehlschlägt und noch keine Cronjobs vorhanden sind. In diesem Fall erstellt der Einzeiler NICHT den Cronjob, sondern stoppt das Skript NICHT. Der stille Fehler kann sehr irreführend sein.Der Grund dafür ist, dass die
crontab -l
Rückgabe mit einem1
Rückkehrcode erfolgt und der nachfolgende Befehl (theecho
) nicht ausgeführt wird. Daher wird der Cronjob nicht erstellt. Da sie jedoch (aufgrund der Klammern) als Unterprozess ausgeführt werden, stoppen sie das Skript nicht.(Interessanterweise funktioniert es, wenn Sie denselben Befehl erneut ausführen: Wenn Sie ihn einmal ausgeführt haben
crontab -
, wirdcrontab -l
immer noch nichts ausgegeben, aber es wird kein Fehler mehr zurückgegeben (Sie erhalten dieno crontab for <user>
Nachricht nicht mehr). Der folgendeecho
Befehl wird also ausgeführt und die crontab wird erstellt)In jedem Fall
set -e
muss die Zeile wie folgt lauten:quelle
Als Korrektur zu den Vorschlägen
crontab -l | crontab -
: Dies funktioniert nicht auf jedem System. Zum Beispiel musste ich der Root-Crontab auf Dutzenden von Servern, auf denen eine alte Version von SUSE ausgeführt wird, einen Job hinzufügen (fragen Sie nicht warum). Alte SUSEs stellen der Ausgabe von Kommentarzeilen vorancrontab -l
und machen siecrontab -l | crontab -
nicht idempotent (Debian erkennt dieses Problem in der Crontab-Manpage und hat seine Version von Vixie Cron gepatcht, um das Standardverhalten von zu änderncrontab -l
).Um programmgesteuert Crontabs auf Systemen zu bearbeiten, auf denen
crontab -l
Kommentare hinzugefügt werden , können Sie Folgendes versuchen:EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
Weist crontab an, escat
als Editor zu verwenden (nicht die übliche Standardeinstellung vi), wodurch die Datei nicht geändert, sondern in stdout kopiert wird. Dies kann immer noch fehlschlagen, wenncrontab -
Eingaben in einem anderen Format als dencrontab -e
Ausgaben erwartet werden . Versuchen Sie nicht, das Finalecrontab -
durch zu ersetzencrontab -e
- es wird nicht funktionieren.quelle
Nun,
/etc/crontab
nur eine ASCII-Datei, also ist es am einfachsten, einfachDadurch wird ein Job hinzugefügt, der Ihnen alle 15 Minuten eine E-Mail sendet. Passen Sie den Geschmack an und testen Sie über
grep
oder auf andere Weise, ob die Zeile bereits hinzugefügt wurde, um Ihr Skript idempotent zu machen.Unter Ubuntu et al. Können Sie auch Dateien
/etc/cron.*
ablegen, die einfacher zu erstellen und zu testen sind. Außerdem können Sie sich nicht mit (System-) Konfigurationsdateien wie z/etc/crontab
.quelle
crond
wird überwacht, und zwar auf der angegebenen Plattform des OP.Hier erfahren Sie, wie Sie einen Cron-Eintrag ändern, ohne die Cron-Datei (die verpönt ist) direkt zu bearbeiten.
Wenn Sie einen Cron-Eintrag entfernen möchten, verwenden Sie Folgendes:
Mir ist klar, dass Gaurav nicht darum gebeten hat, aber warum nicht alle Lösungen an einem Ort haben?
quelle
Ich habe ein Crontab-Bereitstellungstool in Python geschrieben: https://github.com/monklof/deploycron
Die Installation Ihrer Crontab ist sehr einfach. Dadurch wird die Crontab mit der vorhandenen Crontab des Systems zusammengeführt.
quelle
Es ist ein Ansatz, um den Cron-Job schrittweise hinzuzufügen:
quelle