Frage Was ist los mit meiner Cronjob-Syntax, versuche ich einen Backtick (`) zu verwenden?


Hier ist, was ich automatisieren möchte:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

Hier ist die Fehlermeldung:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

26
2017-11-13 15:05


Ursprung


Abgesehen davon, dass es einen Fehler gibt, denke darüber nach, dies in ein Schell-Skript zu schreiben. Es wird vorgeben, dass die Crontab ungeschickt ist, und Sie können Ihrer Skriptdatei Kommentare und eine Konfiguration hinzufügen. - PeterMmm


Antworten:


Von Crontab (5):

Das "sechste" Feld (der Rest der Zeile) spezifiziert die   Befehl ausgeführt werden. Der gesamte Befehlsabschnitt der Zeile   zu einem Newline- oder% -Zeichen, wird von / bin / sh ausgeführt   oder durch die Shell, die in der SHELL-Variablen von   Crontab-Datei. Prozentzeichen (%) im Befehl, sofern es nicht maskiert ist   mit Backslash (), wird in Newline-Zeichen geändert,   und alle Daten nach dem ersten% werden an den Befehl als gesendet   Standardeingabe. Es gibt keinen Weg dazu   Teilen Sie eine einzelne Befehlszeile auf mehrere Zeilen, wie die der Shell   nachhängendes "\".

Fügen Sie einfach Backslashes vor% -Zeichen hinzu:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

58
2017-11-13 15:19





So beheben Sie das Problem entkomme deinen% -Zeichen. date +%Y-%m-%d sollte sein date +\%Y-\%m-\%d 

Leider ist diese Antwort ein bisschen spät, aber die Probleme sind nicht PATH oder Backticks - das Problem ist einfach das Das Prozentzeichen '%' ist ein Sonderzeichen, das in crontab-Einträgen für NEWLINE oder STDIN steht.

Dies steht im Konflikt mit der Formatierungseingabe des date Befehl. Als ein solcher Befehl, der umfasst: date +%Y-%m-%d wird interpretiert als:

date Y- m- d


5
2018-03-07 19:57





Ich hatte auch viele Probleme mit Backticks. Manchmal benötigen Sie mehr als ein Vorkommen von Anführungszeichen und Backticks. Ersetzen Sie sie einfach durch $ ().

Beispiel:

export NOW=`date`
by
export NOW=$(date)

-Gilson Soares


4
2017-11-13 16:47



+1 Dies ist heutzutage die bevorzugte Syntax. - Dan Carley
aber es hat nichts mit der Frage des Benutzers zu tun. - Aaron Brown
natürlich hat es, es geht um Backsticks, die Frage noch einmal gelesen. - Sergio Abreu
Danke, es hat eine Weile gedauert, bis ich gemerkt habe, dass die Backticks meine Crons kaputt machen - ich benutze $ () jetzt auch in allen meinen Skripten - Eric Kigathi


Es hat nichts mit Backsticks zu tun. Eine schreckliche Sache ist, dass Cron nicht den Pfad sehen, und Sie müssen Cron sagen "was PATH ist?" immer und immer wieder in den Cron-Skripten.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

Und ich bin dafür, den Befehl in eine Datei zu schreiben, anstatt den Befehl in der Cron-Zeile wörtlich zu übergeben. Es ist viel eleganter zu haben

* * * * * /your/script/here

als

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

Diese Zeile kann in eine Datei, in die Datei chmod + x und in diese Datei, die aufgerufen werden soll, gehen.


-2
2018-02-03 15:43