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

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 somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

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


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.