Hat crontab ein Argument für das Erstellen von cron-Jobs ohne den Editor (crontab -e). Wenn ja, wie würde der Code einen Cronjob aus einem Bash-Skript erstellen?
Sie können das Crontab wie folgt hinzufügen:
#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
* * * * * "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 es 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, echo
gibt den neuen Befehl aus und crontab -
fügt alle gedruckten Dateien in die Crontab-Datei ein. Sie können den Effekt sehen, indem Sie einen neuen crontab -l
ausführen.
Für diese kürzere Datei ist keine temporäre Datei erforderlich. Sie ist gegen mehrere Einfügungen geschützt und ermöglicht Ihnen, den Zeitplan eines vorhandenen Eintrags zu ändern.
Sagen Sie, Sie haben diese:
croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"
So fügen Sie es ohne Duplizierung zur Crontab hinzu:
( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -
So entfernen Sie es aus der Crontab, unabhängig vom aktuellen Zeitplan:
( crontab -l | grep -v -F "$croncmd" ) | crontab -
Anmerkungen:
Danke an alle für Ihre Hilfe. Was ich hier und anderswo gefunden habe, ist folgendes:
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 Notwendigkeit der beiden Variablen beseitigen kann, ohne mich zu wiederholen.
command
ist offensichtlich der Befehl, den ich einplanen möchte. job
nimmt $command
und fügt die Planungsdaten hinzu. Ich brauchte beide Variablen getrennt in der Codezeile, die die Arbeit erledigt.
<(*command*)
), um die Ausgabe von crontab -l
in eine Eingabe für den Befehl fgrep
umzuwandeln.fgrep
filtert dann alle Übereinstimmungen von $command
(Option -v
), ohne Berücksichtigung der Groß- und Kleinschreibung (Option -i
).<(*command*)
) verwendet, um das Ergebnis wieder in eine Eingabe für den Befehl cat
umzuwandeln.cat
-Befehl empfängt ebenfalls echo "$job"
(selbsterklärend) durch Verwendung des Weiterleitungs-Dingsy (<(*command*)
).crontab -l
und der einfache echo "$job"
, kombiniert, werden über Pipes ('|') an crontab -
übergeben, um schließlich geschrieben zu werden.Diese Codezeile filtert alle Cron-Jobs heraus, die mit dem Befehl übereinstimmen, und schreibt dann die verbleibenden Cron-Jobs mit den neuen aus. Sie wirken wie eine "Hinzufügen" - oder "Update" -Funktion .. __ tauschen Sie die Werte für die Variablen command
und job
aus.
EDIT (festes Überschreiben):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
Es gibt viele gute Antworten auf die Verwendung von Crontab, aber keine einfachere Methode, wie beispielsweise cron
.
Die Verwendung von cron
würde Systemdateien und Verzeichnisse nutzen, die sich unter /etc/crontab
, /etc/cron.daily,weekly,hourly
oder /etc/cron.d/
befinden:
cat > /etc/cron.d/<job> << EOF
Shell=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root HOME=/
01 * * * * <user> <command>
EOF
In diesem Beispiel haben wir eine Datei in /etc/cron.d/
erstellt, die Umgebungsvariablen für die erfolgreiche Ausführung des Befehls bereitgestellt und die user
für den Befehl sowie die command
selbst angegeben. Diese Datei sollte nicht ausführbar sein und der Name sollte nur alphanumerische Zeichen und Bindestriche enthalten (weitere Details unten).
Um eine gründliche Antwort zu geben, betrachten wir die Unterschiede zwischen crontab
und cron/crond
:
crontab -- maintain tables for driving cron for individual users
Für diejenigen, die den Job im Kontext ihres Benutzers im System ausführen möchten, kann die Verwendung von crontab
durchaus sinnvoll sein.
cron -- daemon to execute scheduled commands
Für diejenigen, die das Konfigurationsmanagement verwenden oder Jobs für andere Benutzer verwalten möchten, sollten Sie in diesem Fall cron
verwenden.
Ein kurzer Auszug aus den Manpages zeigt einige Beispiele, was zu tun ist und was nicht:
/ etc/crontab und die Dateien in /etc/cron.d müssen im Besitz von root sein und dürfen nicht gruppen- oder schreibgeschützt sein. Im Gegensatz zum Spool-Bereich können auch die Dateien unter /etc/cron.d oder die Dateien unter /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly sein Symlinks, vorausgesetzt, sowohl der Symlink als auch die Datei, auf die er verweist, 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 as Sie werden von Run-Parts ausgeführt (weitere Informationen finden Sie unter Run-Parts (8)).
Source:http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html
Die Verwaltung von crons auf diese Weise ist aus Systemsicht einfacher und skalierbarer, ist jedoch nicht immer die beste Lösung.
Möglicherweise automatisieren Sie dies, und Sie möchten nicht, dass ein Job zweimal hinzugefügt wird.
__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 die korrekte DASH-Syntax (sh
) nicht bekannt.
Update: 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 auch eine separate Datei verwenden:
echo "1 2 3 4 5 /root/bin/backup.sh" |Sudo tee /etc/crond.d/backup
Fand die in eine andere SO Frage .
Eine Variante, die crontab nur bearbeitet, wenn die gewünschte Zeichenfolge dort nicht gefunden wird:
CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
Für eine schnelle und schmutzige Erstellung/Ersetzung einer Crontab mit einem BASH-Skript habe ich folgende Notation verwendet:
crontab <<EOF
00 09 * * 1-5 echo hello
EOF
Wenn Sie den Vixie Cron verwenden, z. Bei den meisten Linux-Distributionen können Sie einfach eine Datei in /etc/cron.d mit dem einzelnen Cronjob ablegen.
Dies funktioniert natürlich nur für root. Wenn Ihr System dies unterstützt, sollten Sie dort einige Beispiele sehen. (Beachten Sie den in der Zeile enthaltenen Benutzernamen in derselben Syntax wie das alte/etc/crontab.)
Es ist ein trauriger Fehler in cron, dass es keine Möglichkeit gibt, dies als normaler Benutzer zu handhaben, und dass so viele cron-Implementierungen überhaupt keine Möglichkeit haben, dies zu handhaben.
Hier ist eine Bash-Funktion zum Hinzufügen eines Befehls zu crontab
ohne Duplizierung
function addtocrontab () {
local frequency=$1
local command=$2
local job="$frequency $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
}
addtocrontab "0 0 1 * *" "echo hello"
Bash-Skript zum Hinzufügen von Cron-Jobs ohne den interaktiven Editor ..__ Mit dem folgenden Code können Sie einen Cronjob mit Linux-Dateien hinzufügen.
#!/bin/bash
cron_path=/var/spool/cron/crontabs/root
#cron job to run every 10 min.
echo "*/10 * * * * command to be executed" >> $cron_path
#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed" >> $cron_path
CRON="1 2 3 4 5 /root/bin/backup.sh"
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
füge den Parameter -w zum Befehl grep exact hinzu, ohne dass der Parameter -w den cronjob "testing" hinzufügt, wodurch der cron-Job "testing123" gelöscht wird.
skriptfunktion zum Hinzufügen/Entfernen von Cronjobs. keine doppelten einträge:
cronjob_editor () {
# usage: cronjob_editor '<interval>' '<command>' <add|remove>
if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi
if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi
if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi
if [[ "$3" == add ]] ;then
# add cronjob, no duplication:
( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab -
Elif [[ "$3" == remove ]] ;then
# remove cronjob:
( crontab -l | grep -v -F -w "$2" ) | crontab -
fi
}
cronjob_editor "$1" "$2" "$3"
geprüft :
$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab -l
$ */10 * * * * echo "this is a test" > export_file
Also in Debian, Ubuntu und vielen ähnlichen Debian-basierten Distributionen ...
Es gibt einen Cron-Task-Verkettungsmechanismus, der eine Konfigurationsdatei übernimmt, sie bündelt und sie Ihrem laufenden Cron-Service hinzufügt.
Sie können eine Datei unter /etc/cron.d/somefilename ablegen, wobei der Dateiname beliebig ist.
Sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync
Lass uns das zerlegen:
Sudo - weil Sie erhöhte Berechtigungen benötigen, um die cron-Konfigurationen im Verzeichnis/etc zu ändern
echo - ein Fahrzeug, um die Ausgabe auf Standardausgang zu erstellen. Printf, Katze ... würde auch funktionieren
"- Verwenden Sie eine Doppelquote am Anfang Ihrer Zeichenfolge. Sie sind ein Profi
0,15,30,45 * * * * - der Standard-Cron-Laufplan, der alle 15 Minuten ausgeführt wird
ntpdate -u time.nist.gov - der eigentliche Befehl, den ich ausführen möchte
"- weil meine ersten doppelten Anführungszeichen einen Buddy benötigen, um die gerade ausgegebene Zeile zu schließen
>> - die doppelte Weiterleitung hängt an, anstatt sie zu überschreiben *
/etc/cron.d/vmclocksync - vmclocksync ist der Dateiname, den ich ausgewählt habe. Er geht in /etc/cron.d/
* Wenn wir die> Weiterleitung verwenden, können wir garantieren, dass nur ein Aufgabeneintrag vorhanden ist. Es besteht jedoch die Gefahr, dass andere Regeln in einer vorhandenen Datei verworfen werden. Sie können selbst entscheiden, ob eine Vernichtung mit> richtig ist oder Duplikate mit >> für Sie sind. Alternativ können Sie etwas Falsches oder Kompliziertes tun, um zu überprüfen, ob der Dateiname vorhanden ist, ob etwas darin enthalten ist und ob Sie irgendwelche Duplikate hinzufügen - aber ich habe etwas zu tun und kann das nicht Sie jetzt.
skriptfunktion zum Hinzufügen von Cronjobs. doppelte Einträge prüfen, verwendbare Ausdrücke *> "
cronjob_creator () {
# usage: cronjob_creator '<interval>' '<command>'
if [[ -z $1 ]] ;then
printf " no interval specified\n"
Elif [[ -z $2 ]] ;then
printf " no command specified\n"
else
CRONIN="/tmp/cti_tmp"
crontab -l | grep -vw "$1 $2" > "$CRONIN"
echo "$1 $2" >> $CRONIN
crontab "$CRONIN"
rm $CRONIN
fi
}
geprüft :
$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab -l
$ */10 * * * * echo "this is a test" > export_file
quelle: mein Gehirn;)
Meine bevorzugte Lösung wäre dies:
(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
Dadurch wird sichergestellt, dass Sie die leere neue Zeile unten korrekt verarbeiten. Um Probleme mit Crontab zu vermeiden, sollten Sie die Crontab-Datei normalerweise mit einer leeren neuen Zeile beenden. Das obige Skript stellt sicher, dass zuerst alle leeren Zeilen mit dem "grep" entfernt werden. Teil und fügen Sie am Ende eine neue Leerzeile mit dem "\ n" am Ende des Skripts ein. Dadurch wird auch verhindert, dass eine leere Zeile über dem neuen Befehl angezeigt wird, wenn Ihre vorhandene Crontab-Datei mit einer leeren Zeile endet.
Nein, es gibt keine Option in crontab, um die cron-Dateien zu ändern.
Sie müssen: die aktuelle Cron-Datei (crontab -l> newfile) nehmen, ändern und die neue Datei einfügen (crontab newfile).
Wenn Sie mit Perl vertraut sind, können Sie dieses Modul Config :: Crontab verwenden.
LLP, Andrea
echo "0 * * * * docker system Prune --force >/dev/null 2>&1" | Sudo tee /etc/cron.daily/dockerprune