Ich möchte in der Lage sein, programmgesteuert einen neuen Cron-Job hinzuzufügen. Was ist der beste Weg, dies zu tun?
Aus meinen Nachforschungen geht hervor , dass ich die aktuelle Crontab entleeren und dann eine neue anhängen und diese zurück in die Crontab leiten könnte:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Gibt es einen besseren Weg?
Antworten:
Es hat immer gut für mich funktioniert.
Sie sollten ein etwas komplexeres Skript in Betracht ziehen, das drei Dinge kann.
Fügen Sie eine Crontab-Linie hinzu. versichern, dass es nicht existierte. Hinzufügen, wenn es bereits existiert, ist schlecht.
Entfernen Sie die Crontab-Leitung. Vielleicht nur Warnung, wenn es nicht existiert.
Eine Kombination der beiden oben genannten Merkmale, um die Crontab-Linie zu ersetzen.
quelle
Der beste Weg, wenn Sie als root ausgeführt werden, besteht darin, eine Datei in /etc/cron.d abzulegen
Wenn Sie einen Paketmanager zum Packen Ihrer Software verwenden, können Sie einfach Dateien in diesem Verzeichnis ablegen. Diese werden so interpretiert, als wären sie Crontabs, jedoch mit einem zusätzlichen Feld für den Benutzernamen, z.
Dateiname:
/etc/cron.d/per_minute
Inhalt:
* * * * * root /bin/sh /home/root/script.sh
quelle
/etc/cron.d/*
? Es ist schwer zu wissen, ob etwas funktioniert, wenn man eine Stunde warten muss, um es zu überprüfen!Die Lösung von OP weist einen Fehler auf. Möglicherweise können Einträge zweimal hinzugefügt werden.
quelle
sort
zuvoruniq
:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Verwenden Sie die-u
Option einsort
.Etwas zu cron hinzufügen
Um dies von Cron zu entfernen
Hoffnung würde jemandem helfen
quelle
2>&1 | grep -v "no crontab"
denn wenn keine Crontab vorhanden ist, wird die Ausgabezeilecrontab: no crontab for...
an stderr gesendet. Es gibt keinen Grund, diese Ausgabe zu erfassen, an stdout zu senden und sie dann mit grep herauszufiltern. Wenn Sie vermeiden möchten,crontab: no crontab for...
in Ihrer Ausgabe zu sehen, verwenden Sie2> /dev/null | sort....
.Wenn Sie vorhaben, dies für ein einmaliges Szenario zu tun, um nur etwas zu sehen, schauen Sie sich 'at' an.
quelle
Ändern Sie einfach den Editor in den Befehl tee:
quelle
Angenommen, Ihre Crontab enthält bereits einen Eintrag, sollte der folgende Befehl relativ gut funktionieren. Beachten Sie, dass die
$CMD
Variable nur zur besseren Lesbarkeit dient. Das Sortieren vor dem Filtern von Duplikaten ist wichtig, da esuniq
nur in benachbarten Zeilen funktioniert.Wenn Sie derzeit eine leere Crontab haben, erhalten Sie die folgende Fehlermeldung an stderr:
Wenn Sie dies vermeiden möchten, können Sie ein wenig Komplexität hinzufügen und Folgendes tun:
quelle
Die meisten Lösungen hier sind für das Hinzufügen von Linien zur Crontab. Wenn Sie mehr Kontrolle benötigen, möchten Sie in der Lage sein, den gesamten Inhalt der Crontab zu kontrollieren.
Sie können Rohrleitungen verwenden, um dies ziemlich elegant zu tun.
Um die Crontab vollständig neu zu schreiben, tun Sie dies
Dies sollte leicht mit anderen hier beschriebenen Antworten wie zu kombinieren sein
Oder wenn Sie den Inhalt in einer Datei haben, ist es noch einfacher
quelle
Hier ist ein weiterer einzeiliger Weg, der Duplikate vermeidet
Und hier ist eine Möglichkeit, JohnZs Antwort zu geben und
no crontab for user
Nachrichten zu vermeiden , oder wenn Sie in einer Typumgebung arbeitenset -eu
müssen und nichts einen Fehler zurückgeben kann (in diesem Fall ist das2>/dev/null
Teil optional):Oder wenn Sie die Dinge so aufteilen möchten, dass sie besser lesbar sind:
Oder entfernen Sie optional alle Verweise auf Ihren_Befehl (z. B. wenn sich der Zeitplan geändert hat, möchten Sie, dass er nur einmal erstellt wird). In diesem Fall brauchen wir nicht mehr
uniq
(zusätzlicher Bonus, Einfügereihenfolge bleibt ebenfalls erhalten):quelle
Mann Crontab ist auch nützlich:
CRONTAB (1)
NAME
ZUSAMMENFASSUNG
quelle
Neben der Antwort von JohnZ finden Sie hier die Syntax, die Sie als Root planen können, wenn Sie ein Sudoer sind:
quelle
quelle
Dadurch wird überprüft, ob Ihr Befehl noch nicht vorhanden ist, bevor Sie ihn hinzufügen.
Prost.
quelle
Piping stdout in
crontab
hat die neue crontab für mich unter macOS nicht installiert, daher habe ich diese Lösung stattdessen mithilfe destee
Editors in einer Sub-Shell gefunden:quelle
Wenn die Aufgabe als Benutzer ausgeführt werden soll:
Wenn die Aufgabe mit Berechtigungen ausgeführt werden soll:
und Aufgabe überprüfen (mit oder ohne 'sudo'):
quelle
Sie können Ihre Aufgaben auch zu /etc/cron.*/ hinzufügen.
quelle
Sie können die Cron-Tabellentextdatei auch direkt bearbeiten, aber Ihre Lösung scheint vollkommen akzeptabel zu sein.
quelle