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.

720voto

dogbane Punkte 253146

Sie können die crontab wie folgt ergänzen:

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

Erläuterung der Cron-Linie

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Quelle nixCraft .

402voto

TheBonsai Punkte 13897

Möglicherweise können Sie dies im laufenden Betrieb tun.

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l listet die aktuellen Crontab-Aufträge auf, cat druckt es aus, echo druckt den neuen Befehl und crontab - fügt alle gedruckten Informationen in die crontab-Datei ein. Sie können den Effekt sehen, indem Sie eine neue crontab -l .

113voto

MoonCactus Punkte 1356

Diese kürzere Version benötigt keine temporäre Datei, ist immun gegen mehrfaches Einfügen und ermöglicht es Ihnen, den Zeitplan eines bestehenden Eintrags zu ändern.

Nehmen wir an, Sie haben diese:

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

Zum Hinzufügen zur crontab, ohne Duplizierung:

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

Um sie aus der Crontab zu entfernen, unabhängig von ihrem aktuellen Zeitplan:

( crontab -l | grep -v -F "$croncmd" ) | crontab -

Anmerkungen:

  • grep -F findet die Zeichenkette wörtlich, da wir sie nicht als regulären Ausdruck interpretieren wollen
  • Wir ignorieren auch die Zeitplanung und suchen nur nach dem Befehl. Auf diese Weise kann der Zeitplan geändert werden, ohne dass eine neue Zeile in der crontab hinzugefügt werden muss

45voto

Stoutie Punkte 1804

Vielen Dank an alle für ihre Hilfe. Wenn ich zusammensetze, was ich hier und anderswo gefunden habe, komme ich zu folgendem Ergebnis:

Der Kodex

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

Ich konnte nicht herausfinden, wie ich die beiden Variablen überflüssig machen konnte, ohne mich zu wiederholen.

command ist offensichtlich der Befehl, den ich planen möchte. job nimmt $command und fügt die Terminierungsdaten hinzu. Ich brauchte beide Variablen getrennt in der Codezeile, die die Arbeit erledigt.

Einzelheiten

  1. Dank an duckyflip, ich verwende dieses kleine Umleitungsdingens ( <(*command*) ), um den Ausgang von crontab -l zur Eingabe für die fgrep Befehl.
  2. fgrep filtert dann alle Übereinstimmungen von $command ( -v Option), Groß- und Kleinschreibung nicht beachten ( -i Option).
  3. Auch hier ist das kleine Umleitungsdingsbums ( <(*command*) ) wird verwendet, um das Ergebnis wieder in eine Eingabe für die cat Befehl.
  4. En cat Befehl erhält auch echo "$job" (selbsterklärend), wiederum durch die Verwendung des Redirect-Dings ( <(*command*) ).
  5. Die gefilterte Ausgabe von crontab -l und die einfache echo "$job" kombiniert, werden über die Pipeline ('|') an crontab - endlich geschrieben werden.
  6. Und sie lebten glücklich und zufrieden bis ans Ende ihrer Tage!

Kurz und bündig:

Diese Codezeile filtert alle Cron-Aufträge heraus, die mit dem Befehl übereinstimmen, und schreibt dann die verbleibenden Cron-Aufträge mit dem neuen aus, was wie eine "Add"- oder "Update"-Funktion wirkt. Um dies zu nutzen, müssen Sie nur die Werte für die command y job Variablen.

33voto

duckyflip Punkte 15559

EDIT (Überschreiben korrigiert):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -

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