Ist es möglich, Variablen in crontab -e zu verwenden?

13

Kann ich sagen:

MYPATH=/root/scripts  
MYSCRIPT=doit.sh

0 1 * * * $MYPATH/$MYSCRIPT

in crontab -e?

Ist es möglich, Variablen in zu verwenden crontab -e?

user19496
quelle

Antworten:

15

Ja, Sie können auf diese Weise Variablen definieren und verwenden. Es gibt eine Einschränkung (die Sie in Ihren Beispielen nicht getroffen haben): Die Zeichenfolge rechts neben dem =Zeichen wird wörtlich interpretiert, wobei führende Leerzeichen entfernt werden, sodass Sie keine Konstrukte wie verwenden können FOO=$BAR/qux(z. B. PATH=$HOME/bin:$PATHnichts Nützliches tun).

Dies ist in der Dokumentation angegeben, die Sie durch Ausführen sehen können

man 5 crontab

(Beachten Sie, dass man crontabdie Dokumentation des crontab Befehls in Abschnitt 1 des Handbuchs angezeigt wird. Sie möchten die Dokumentation des crontab Dateiformats in Abschnitt 5.)

Gilles 'SO - hör auf böse zu sein'
quelle
7

Ich habe es gerade versucht, ja, es ist möglich. Sie können es mit diesem einfachen Beispiel herausfinden, setzen Sie dies in Ihre crontab:

FOO = QWERTY
* * * * * echo $ FOO> ~ / out

Und überprüfen Sie die Datei ~/out(jede Minute aktualisiert), die sie enthalten sollte "qwerty".

cYrus
quelle
2
+1, um zu zeigen, wie das OP ähnliche Dinge selbst herausfinden kann.
Arthaey
In einem besseren Beispiel wird $ FOO im Zielskript verwendet.
Acumenus
4

Während Linux-Crontabs das Definieren einiger Variablen unterstützen, die Literalwerte enthalten, ist es nicht sinnvoll, Langtext auf eine kürzere Darstellung zu komprimieren oder einige Dinge über Cron selbst zu steuern, z. B. wohin E-Mail-Ausgaben gesendet werden sollen.

Die Flexibilität besteht darin, zu verstehen, dass der Befehlsteil des Cron-Eintrags an Systeme übergeben /bin/sh -coder die Shell SHELLauf Systemen definiert wird , die Vixie Cron verwenden (das normalerweise auf Linux-Systemen installiert ist). Dies bedeutet, dass der Rest der Befehlszeile ein einfaches Shell-Skript ist. HINWEIS: Stellen Sie fest, welche Shell verwendet wird. Unter Linux funktioniert der eingebettete Befehl /bin/shnormalerweise /bin/bashso $( ... ), aber nicht auf älteren Systemen, auf denen /bin/shnur verstanden `wird.

Zum Beispiel habe ich eine einfache Crontab-Zeile, die eine MBX-Datei mit gespeicherten Nachrichten monatlich archiviert und komprimiert. Es sieht aus wie das:

15 0 1 * *  nf=MailFeed-$( date +\%Y\%m ).mbx && cd Logs && mv MailFeed.mbx $nf && bzip2 -9 $nf

Dies wird am ersten eines jeden Monats um 00:15 Uhr ausgeführt, ein neuer Dateiname mit CCYYMM festgelegt, die aktuelle Datei auf einen neuen Namen verschoben und komprimiert. Beachten Sie, dass ein nicht entkuppeltes %(Prozentzeichen) als Zeilenumbruch behandelt wird und die darauf folgenden Daten als stdin an den Befehl vor dem Prozentzeichen gesendet werden. Deshalb wird das Normale date +Y+mwie date +\%Y\%moben geschrieben.

D Französisch
quelle
-2

Nein, ein Cronjob kann nicht nur Cron-Artikel enthalten. Ist es nicht eine Option, ein Bash-Skript zu erstellen und das Bash-Skript über einen Cronjob auszuführen?

Maran
quelle
1
Richtig auf einigen anderen Unices, aber Linux Cron unterstützt die Zuweisung von Umgebungsvariablen.
Gilles 'SO - hör auf böse zu sein'