531 Stimmen

Wie erstellt man einen Cron-Job mit der Bash automatisch ohne den interaktiven Editor?

Verfügt crontab über ein Argument zur Erstellung von Cron-Jobs ohne Verwendung des Editors (crontab -e). Wenn ja, wie würde der Code lauten, um einen Cronjob aus einem Bash-Skript zu erstellen?

0 Stimmen

14 Stimmen

Leider zeigen die meisten Top-Antworten hier nur, wie man crontab modifiziert - wenn auch auf einigermaßen sichere Weise - aber ich denke, das ist insgesamt der falsche Ansatz. Besser, sicherer und einfacher ist es, eine Datei in {{cron.d}} abzulegen, und es gibt (derzeit) wenig beachtete Antworten, die erklären, wie man das macht, wenn man weiter unten sucht.

0 Stimmen

Danke @gregmac. Ich habe hinzugefügt dieses Beispiel nachdem ich Beispiele von verschiedenen Seiten gelesen und es selbst ausprobiert habe.

27voto

Mike Mackintosh Punkte 13502

Es gab viele gute Antworten zur Verwendung von crontab, aber keine Erwähnung einer einfacheren Methode, wie zum Beispiel die Verwendung von cron .

Verwendung von cron würde die Systemdateien und Verzeichnisse nutzen, die sich unter /etc/crontab , /etc/cron.daily,weekly,hourly o /etc/cron.d/ :

cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root HOME=/  
01 * * * * <user> <command>
EOF

In dem obigen Beispiel haben wir eine Datei in /etc/cron.d/ die Umgebungsvariablen, damit der Befehl erfolgreich ausgeführt werden kann, und die user für den Befehl, und die command selbst. Diese Datei sollte nicht ausführbar sein und der Name sollte nur alphanumerische Zeichen und Bindestriche enthalten (mehr dazu weiter unten).

Um eine gründliche Antwort zu geben, sollten wir uns die Unterschiede zwischen crontab gegen cron/crond :

crontab -- maintain tables for driving cron for individual users

Diejenigen, die den Auftrag im Kontext ihres Benutzers auf dem System ausführen möchten, können mit crontab kann durchaus sinnvoll sein.

cron -- daemon to execute scheduled commands

Für diejenigen, die Konfigurationsmanagement verwenden oder Aufträge für andere Benutzer verwalten wollen, sollten wir in diesem Fall cron .

Ein kurzer Auszug aus den Manpages gibt Ihnen ein paar Beispiele dafür, was zu tun und zu lassen ist:

/etc/crontab und die Dateien in /etc/cron.d müssen Root gehören und dürfen nicht von Gruppen oder anderen geschrieben werden können. Im Gegensatz zum Spool-Bereich können die Dateien unter /etc/cron.d oder die Dateien unter /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly auch Symlinks sein, vorausgesetzt, sowohl der Symlink als auch die Datei, auf die er zeigt, gehören Root. Die Dateien unter /etc/cron.d müssen nicht ausführbar sein, während die Dateien unter /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly dies müssen, da sie von run-parts ausgeführt werden (siehe run-parts(8) für weitere Informationen).

Quelle: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

Die Verwaltung von Crons auf diese Weise ist einfacher und aus Sicht des Systems besser skalierbar, aber nicht immer die beste Lösung.

11voto

BradChesney79 Punkte 636

In Debian, Ubuntu und vielen ähnlichen Debian-basierten Distros...

Es gibt einen Mechanismus zur Verkettung von Cron-Aufgaben, der eine Konfigurationsdatei nimmt, sie bündelt und sie zu Ihrem laufenden Cron-Dienst hinzufügt.

Sie können eine Datei unter /etc/cron.d/somefilename anlegen, wobei somefilename ein beliebiger Name ist.

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

Nehmen wir das mal auseinander:

sudo - weil Sie erhöhte Rechte benötigen, um Cron-Konfigurationen im /etc-Verzeichnis zu ändern

echo - ein Vehikel, um eine Ausgabe auf std out zu erzeugen. printf, cat... würden auch funktionieren

" - verwenden Sie ein Anführungszeichen am Anfang Ihrer Zeichenfolge, Sie sind ein Profi

0,15,30,45 * * * * - der Standard-Cron-Laufplan, dieser läuft alle 15 Minuten

ntpdate -u time.nist.gov - der eigentliche Befehl, den ich ausführen möchte

" - denn meine ersten doppelten Anführungszeichen brauchen einen Partner, um die auszugebende Zeile zu schließen

>> - die doppelte Umleitung fügt an, anstatt zu überschreiben*

/etc/cron.d/vmclocksync - vmclocksync ist der Dateiname, den ich gewählt habe und der in /etc/cron.d/ steht


* Wenn wir die > Umleitung verwenden, können wir garantieren, dass wir nur einen Aufgabeneintrag haben. Aber wir würden riskieren, alle anderen Regeln in einer bestehenden Datei zu zerstören. Sie können selbst entscheiden, ob eine mögliche Zerstörung mit > richtig ist oder mögliche Duplikate mit >> für Sie sind. Alternativ könnten Sie auch etwas Kompliziertes oder Aufwändiges tun, um zu prüfen, ob der Dateiname existiert, ob etwas darin enthalten ist und ob Sie irgendeine Art von Duplikat hinzufügen - aber ich habe etwas zu tun und kann das jetzt nicht für Sie tun.

8voto

Gibbsoft Punkte 779

Um schnell und einfach eine crontab mit einem BASH-Skript zu erstellen bzw. zu ersetzen, habe ich diese Notation verwendet:

crontab <<EOF
00 09 * * 1-5 echo hello
EOF

7voto

kvz Punkte 4837

Wahrscheinlich automatisieren Sie diesen Vorgang, und Sie möchten nicht, dass ein einzelner Auftrag zweimal hinzugefügt wird. In diesem Fall verwenden Sie:

__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")

Dies funktioniert nur, wenn Sie BASH verwenden. Mir ist nicht bekannt, dass die korrekte DASH ( sh ) Syntax.

更新しました。 Dies funktioniert nicht, wenn der Benutzer noch keine Crontab hat. Ein zuverlässigerer Weg wäre:

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

Wenn Ihre Distribution dies unterstützt, können Sie alternativ auch eine separate Datei verwenden:

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

Gefunden in eine weitere SO-Frage .

6voto

user11547308 Punkte 51
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X