Ich habe ein Bereitstellungsskript, das einem Benutzer etwas hinzufügen muss crontab
(ein Skript auslösen, das die Protokolle alle XXX Tage bereinigt). Dies muss jedoch nur während der ersten Bereitstellung erfolgen oder wenn es aktualisiert werden muss.
(Ich kann rennen xxx.py deploy env
oder xxx.py update env
)
also muss ich das machen:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
Ich sehe nicht, wie man etwas hinzufügt / überprüft / entfernt, crontab
ohne crontab -e
die crontab
Datei zu verwenden oder zu bearbeiten (herunterladen, neu schreiben, erneut hochladen)
PS: Dies ist ein benutzerspezifischer Cronjob. "Webadmin" wird dies tun und er sollte kein Sudo verwenden, um dies zu tun.
/etc/cron.d
? Wenn ja,/etc/crontab
haben Dateien in/etc/cron.d/
ein zusätzliches Feld für den Benutzernamen, unmittelbar nach der Zeitplanspezifikation. zB* * * * * username /path/to/script
. Sehenman 5 crontab
und suchenSYSTEM CRON
.Antworten:
meine bisher beste idee
Um zuerst zu überprüfen, ob der Inhalt mit dem Inhalt übereinstimmt, und nur dann zu aktualisieren, wenn dies nicht der Fall ist:
Dies wird jedoch kompliziert genug, um ein separates Skript für diese Cron-Aufgabe zu erstellen.
andere Ideen
Sie können den String über stdin an crontab senden (Vorsicht, dies löscht alle vorherigen crontab-Einträge):
Dies sollte sogar direkt durch ssh funktionieren:
Wenn Sie an die Datei anhängen möchten, können Sie Folgendes verwenden:
quelle
echo '*...
erweiterte die*
zu einer Liste von Dateien. 2) Die Zeilenenden in der Crontab wurden gelöscht.echo "*...
und 2)echo $
vom Anfang der Zeile entfernte.Für die Aufzeichnung werde ich vorschlagen, zu verwenden
/etc/cron.d/
. Hier kann nur root Dateien schreiben, aber die Einträge können wie jeder Benutzer ausgeführt werden (ohne dass dies erforderlich istsudo
).Dies kann mehrmals angewendet werden, wobei die lokale
webadmin.cron
Datei nach Bedarf aktualisiert wird , bevor sie kopiert wird.Sie können sogar die Bereitstellung entfernen:
Beachten Sie, dass Sie in vielen Fällen das root-Passwort für die Befehle
scp
/ nichtssh
angeben können. Stattdessen müssen Sie öffentliche / private Schlüsselzertifikate eingerichtet haben. Implizit hat das lokale Konto (was auch immer es ist) vollen Root-Zugriff auf den Remote-Server. Es ist im Moment unklar, ob dies für Ihr spezifisches Szenario ein Show-Stopper wäre.quelle
/etc/cron.d/
existiert genau für diesen Zweck - so dass Pakete / Bereitstellungen einfach eine Crontab-Datei hier ablegen können.Ich empfehle dringend, Ansible * zu verwenden, anstatt Ihre eigenen zu rollen. Oder Puppet oder Chef - aber Ansible eignet sich gut für solche Skripts zur Bereitstellung ohne Infrastruktur.
Das liegt daran, dass es bereits Module gibt, die solche Probleme lösen sollen, und Konfigurationsverwaltungstools haben Idempotenz als grundlegendes Entwurfsziel - dies ist die Eigenschaft, nur dann zu ändern, wenn dies erforderlich ist, selbst wenn Sie es versehentlich (oder absichtlich) erneut ausführen.
Insbesondere das Cron-Modul von Ansible kann Benutzer-Crontabs ändern. Wenn Sie sich später an die Verwendung von System-Crontabs anpassen möchten, ist dies als Bonus eine sehr einfache Optimierung und kein Umschreiben.
* Haftungsausschluss: Ich arbeite für Red Hat und Ansible ist ein von Red Hat gesponsertes Projekt.
quelle
Wenn Sie einen Cron-Job über das Zielkonto hinzufügen möchten, führen Sie ihn aus
crontab -e
. Dieser Befehl leitet die Crontab durch einen Editor. Weisen Sie es an, einen Editor-Befehl zu verwenden, der die Crontab nach Ihren Wünschen ändert. Der Editor-Befehl wird als Shell-Snippet mit dem Namen einer angehängten temporären Datei ausgeführt.Dieser Ansatz ist zuverlässiger als der native,
crontab -l | … | crontab -
da dieser für eine Race-Bedingung anfällig ist, wenn die Crontab gleichzeitig bearbeitet wird: Änderungen, die zwischen dem Aufruf voncrontab -l
und dem Aufruf von vorgenommen werdencrontab -
, werden rückgängig gemacht.quelle
Dies ist eine Anpassung dessen, was @ phillip-zyan-k-lee-stockmann angeboten hat, basierend auf seinem Code "Beste Idee bisher".
Meine Änderungen von seinem (ausgezeichneter und hilfreicher Ausschnitt) sind im Grunde:
Und hier ist mein Code für das, was ich genannt habe
crontab-add-hourly.sh
:Beispiel für Verwendung und Ausgabe:
quelle
TL; DR: Dies funktioniert tatsächlich, getestet in Bash 4.4.
Wie in den Kommentaren von @Phillip -Zyan K Lee-Stockmann erwähnt, wird diese Lösung
*
in alle Dateien im aktuellen Verzeichnis erweitert. Ich konnte den Vorschlag der Kommentare nicht zum Laufen bringen. set -f deaktiviert die Platzhaltererweiterung, siehe /programming//a/11456496/915441 .quelle