Was stimmt nicht mit meiner Cronjob-Syntax? Ich versuche, ein Backtick (`) zu verwenden.

31

Folgendes möchte ich automatisieren:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -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
Terry G Lorber
quelle
2
Abgesehen von dem Fehler beim Ausgeben, sollten Sie dies in ein Schellskript einfügen. Es gibt vor, dass die Crontab unbeholfen ist, und Sie können Ihrer Skriptdatei Kommentare und Konfigurationen hinzufügen.
PeterMmm

Antworten:

67

Aus crontab (5) :

Das sechste Feld (der Rest der Zeile) gibt den auszuführenden Befehl an. Der gesamte Befehlsteil der Zeile, bis auf eine neue Zeile oder ein% -Zeichen, wird von / bin / sh oder von der in der SHELL-Variablen der crontab-Datei angegebenen Shell ausgeführt. Prozentzeichen (%) im Befehl werden, sofern kein umgekehrter Schrägstrich () verwendet wird, in Zeilenumbrüche umgewandelt, und alle Daten nach dem ersten% werden als Standardeingabe an den Befehl gesendet. Es gibt keine Möglichkeit, eine einzelne Befehlszeile auf mehrere Zeilen aufzuteilen, wie z. B. das abschließende "\" der Shell.

Fügen Sie einfach Backslashes vor% Zeichen hinzu:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Juliano
quelle
8

Um das Problem zu beheben, geben Sie% Zeichen ein . date +%Y-%m-%dsollte seindate +\%Y-\%m-\%d

Leider ist diese Antwort etwas verspätet, aber es handelt sich nicht um PATH oder Backticks. Das Prozentzeichen '%' ist lediglich ein Sonderzeichen, mit dem in crontab-Einträgen eine NEWLINE oder eine STDIN angegeben wird .

Dies steht in Konflikt mit der Formatierungseingabe des dateBefehls. Als solcher Befehl, der Folgendes enthält: date +%Y-%m-%dwird interpretiert als:

date Y- m- d

Eric Kigathi
quelle
4

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

Guilsson
quelle
1
+1 Dies ist heutzutage sowieso die bevorzugte Syntax.
Dan Carley
4
aber es hat nichts mit der Frage des Benutzers zu tun.
Aaron Brown
1
Natürlich hat es, es geht um Backsticks, die Frage noch einmal gelesen.
Sergio Abreu
Danke, es hat eine Weile gedauert, bis mir klar wurde, dass die Backticks meine Crons kaputt gemacht haben - jetzt habe ich auch angefangen, $ () in all meinen Skripten zu verwenden
Eric Kigathi
-2

Es hat nichts mit Backsticks zu tun. Eine schreckliche Sache ist, dass cron den PFAD NICHT sieht und Sie cron sagen MÜSSEN, "was PFAD 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 ihn buchstäblich in der Cron-Zeile 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, chmod + x-Datei, und in diese aufzurufende Datei gehen.

Sergio Abreu
quelle