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?
Antworten
Zu viele Anzeigen?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.
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.
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 .
0 Stimmen
Mögliches Duplikat von Wie kann ich programmatisch einen neuen Cron-Job erstellen?
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.
1 Stimmen
@gregmac Verwenden
/etc/cron.daily/
und Freunde scheint Superuser-Rechte zu erfordern.