it-swarm.com.de

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

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?

313
Raúl Roa

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

Cron Line Erklärung

* * * * * "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 .

455
dogbane

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.

273
TheBonsai

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:

  • grep -F stimmt mit der Zeichenfolge wörtlich überein, da wir sie nicht als regulären Ausdruck interpretieren wollen
  • Wir ignorieren auch die Zeitplanung und suchen nur nach dem Befehl. Diesen Weg; Der Zeitplan kann geändert werden, ohne dass das Risiko besteht, der crontab eine neue Zeile hinzuzufügen
63
MoonCactus

Danke an alle für Ihre Hilfe. Was ich hier und anderswo gefunden habe, ist folgendes:

Der Code

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.

Einzelheiten

  1. Dank an duckyflip, ich verwende dieses kleine Umleitungs-Ding (<(*command*)), um die Ausgabe von crontab -l in eine Eingabe für den Befehl fgrep umzuwandeln.
  2. fgrep filtert dann alle Übereinstimmungen von $command (Option -v), ohne Berücksichtigung der Groß- und Kleinschreibung (Option -i).
  3. Wieder wird das kleine Umleitungs-Ding (<(*command*)) verwendet, um das Ergebnis wieder in eine Eingabe für den Befehl cat umzuwandeln.
  4. Der cat-Befehl empfängt ebenfalls echo "$job" (selbsterklärend) durch Verwendung des Weiterleitungs-Dingsy (<(*command*)).
  5. Die gefilterte Ausgabe von crontab -l und der einfache echo "$job", kombiniert, werden über Pipes ('|') an crontab - übergeben, um schließlich geschrieben zu werden.
  6. Und wenn sie nicht gestorben sind, leben sie noch heute!

In einer Nussschale:

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.

37
Stoutie

EDIT (festes Überschreiben):

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

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.

9
Mike Mackintosh

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 .

7
kvz

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")
5
Gerald Schade

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
4
Gibbsoft

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.

3
chuck

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"
1
Klas Mellbourn

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
1
akash
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
1
speefak

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.

0
BradChesney79

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;)

0
user8555334

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.

0
gsus

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

0
andcoz
echo "0 * * * * docker system Prune --force >/dev/null 2>&1" | Sudo tee /etc/cron.daily/dockerprune
0
user11547308