Wie legen Sie eine DATE-Variable fest, die in einem Protokoll für die Crontab-Ausgabe verwendet werden soll?

10

Ich spielte mit einigen Datumsvariationen wie

DATE = $(date)

aber das hat auch nicht funktioniert

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

Dies gibt nur den Text so aus, wie er ist ...

Ich möchte einen Protokolleintrag in crontab.log mit einem Zeitstempel für jedes Update erstellen

Wie kann ich das unter CentOS 6 machen?

AKTUALISIEREN

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

hat nur [CRON] und NICHTS gerendert, als ich es ausprobiert habe = /

Qodeninja
quelle

Antworten:

28

Cron ist keine Shell - es analysiert Befehle nicht auf die gleiche Weise wie eine Shell. Daher wird Ihre Variable so zugewiesen, als wäre es statischer Text.

Ich kenne drei Lösungen für dieses Problem:

Option 1: Verwenden Sie ein Shell-Skript, um Ihren Befehl zu generieren, fügen Sie die gewünschten Variablen und Logik ein - und rufen Sie das Shell-Skript von cron aus auf.

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

Option 2: Fügen Sie den Datumsbefehl direkt in Ihren Befehl ein. Da der gesamte Befehl an die Shell übergeben wird, wird das Datum verarbeitet und durch ein tatsächliches Datum ersetzt.

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

Option 3: Legen Sie die Zeichenfolgenvariable in cron fest und übergeben Sie sie an Ihren zu verarbeitenden Befehl (Hinweis: Die Prozentzeichen müssen nicht maskiert werden, und die Variable selbst wird in $ () eingeschlossen, um sie in einer separaten Shell auszuführen.) Backticks sollten gleich funktionieren):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(In allen oben genannten Fällen können Sie natürlich eine Variable für den Protokollpfad verwenden, anstatt ihn fest zu codieren.)

cyberx86
quelle
1
danke für das tolle Feedback +1, ich habe versucht, es der Crontab hinzuzufügen, aber das hat nicht funktioniert = / es macht nie DATEVAR
qodeninja
Ich habe dies gerade auf einem RHEL / CentOS6-kompatiblen System gemacht und es ergab das erwartete Ergebnis (dh der Datei wurde eine neue Zeile mit dem Datum hinzugefügt). Welche Option (von den 3 oben) haben Sie ausprobiert und was war das Ergebnis - seien Sie genau - und gab es einen Fehler in / var / log / cron? (Wenn Sie die Skriptoption verwenden, a) vergessen Sie nicht, chmod + x und b) versuchen Sie es zuerst alleine (dh nicht durch cron))
cyberx86
1
Option 3 =], ich hatte das schon einmal versucht, aber es wurde nicht gerendert. Aber jetzt merke ich, dass du etwas anderes getan hast. Warum hast du das $ ($ (DATE)) verdoppelt? siehe mein Update oben
Qodeninja
1
Sie haben einen Tippfehler in dem Update, das Sie hinzugefügt haben - das ist es $($DATEVAR)nicht $($(DATEVAR)). Stellen Sie sich das so vor - $()das heißt, die äußere Klammer - startet eine neue Shell, um alles zu verarbeiten, was sich in den Klammern befindet. In diesem Fall wird die Variable $ DATEVAR auf eine Zeichenfolge gesetzt und an die Shell übergeben. $(DATEVAR)ist nichts - weil DATEVARes nichts ist (dh es fehlt ein $, um es als Variable zu identifizieren). Sie können auch Backticks verwenden $DATEVAR, um das gleiche Ergebnis zu
erzielen
Meinetwegen. aktualisiert es. Lass es uns mit diesem bösen Jungen versuchen! - Hazaaah! es funktionierte lol
qodeninja