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?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 .
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
.
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
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
- Dank an duckyflip, ich verwende dieses kleine Umleitungsdingens (
<(*command*)
), um den Ausgang voncrontab -l
zur Eingabe für diefgrep
Befehl. fgrep
filtert dann alle Übereinstimmungen von$command
(-v
Option), Groß- und Kleinschreibung nicht beachten (-i
Option).- Auch hier ist das kleine Umleitungsdingsbums (
<(*command*)
) wird verwendet, um das Ergebnis wieder in eine Eingabe für diecat
Befehl. - En
cat
Befehl erhält auchecho "$job"
(selbsterklärend), wiederum durch die Verwendung des Redirect-Dings (<(*command*)
). - Die gefilterte Ausgabe von
crontab -l
und die einfacheecho "$job"
kombiniert, werden über die Pipeline ('|') ancrontab -
endlich geschrieben werden. - 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.
- See previous answers
- Weitere Antworten anzeigen
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.