Disfunctions.de

Das Blog der gnadenlosen Fehlfunktionen!

Cron Jobs und der Syntax Fehler

Erstellt von Matthias am Montag 5. Oktober 2009

Eine gewisse Zeit lang habe ich mich mit dem Einrichten der Cron Jobs für unsere Backup-Strategie, auf dem neuen Server, herum geärgert. Ich habe im Grunde die Cron Jobs vom Centos Server übertragen auf den nun verwendeten Ubuntu Server. Doch jedes mal kam folgender Fehler:



/bin/sh: Syntax error: EOF in backquote substitution


 
Diese Fehlerausgabe kam nur dann wenn der Befehl über die Cronfunktion von Plesk auf Ubuntu Server lief. Wenn man den Befehl direkt in die Konsole eingibt, läuft er wunderbar.

Wie ich nach langer und schließlich doch noch ergiebiger Ausquetschung Google’s erfahren habe, ist an diesem Fehler meine verwendete Date Funktion schuld. Durch Einfügen von



`date +%Y-%m-%d`


 
in den Dateinamen wollte ich erreichen, dass das Archiv immer mit dem aktuellen Datum benannt wird. Dies klappte in dieser Form leider nicht.

Ubuntu hat wohl die Eigenart (Ja ok, evtl. war es auch die Eigenart von Centos das es so vorher funktionierte), dass man vor Zeichen wie dem % ein Backslash \ einfügen muss. Meine Date Funktion muss also so



`date +\%Y-\%m-\%d`


 
aussehen, damit Sie funktioniert.

Anschließend würde der komplette Befehl so aussehen:



tar cvfz /backups/taeglich/domain.de/backup-name_`date +\%Y-\%m-\%d`.tar.gz /var/www/vhosts/domain.de/httpdocs/


 
wie ich auch hier ausführlicher geschrieben habe.

Ganz im Ernst, da muss man erst mal drauf kommen, dass der Befehl wegen den Prozent Zeichen abgebrochen wird und einen Syntax Fehler ausspuckt. In den Kommentaren zu diesem Artikel kam auch noch ein anderer Interessanter Tipp dazu von unserem Leser Pluvo.

6 Kommentare zu “Cron Jobs und der Syntax Fehler”


  1. philbert sagt:

    hm das muss aber an plesk liegen, da ich
    bei meinem backup auch tar ohne diese \ benutze..

    ist die tar-option v für verbose bei dir gewollt?
    ich würde die eher ausschalten, wenn du tar in skripten benutzt.
    außer du speicherst irgendwo die ausgabe…


  2. matthias sagt:

    Ja, das -v ist Absicht, die Ausgabe läuft hierbei in eine Mail die automatisch nach dem CronJob versendet wird. So kann ich immer sehen ob die Cron Jobs stattgefunden haben und auch erfolgreich waren ohne mir jedes Archiv einzeln anzuschauen. Und es ist schön übersichtlich in meinen Mails drin.


  3. Schumbi sagt:

    so ein % ist schon ab und an fies, wenn es nicht entschärft wurde durch einen Backslash. Diese Fehler sind immer die gemeinsten wie ich finde. Wer kommt schon schnell darauf, dass ein unerwartet auftretender Fehler unescapeten Prozentzeichen oder sonstigen Sonderzeichen geschuldet ist. Da ich mir dabei auch immer nicht so sicher bin, versuche ich immer alles zu escapen, was nach Sonderzeichen riecht. Es schadet nicht(ein paar mehr Zeichen vielleicht) spart einem aber ne Menge Arbeit.

    lG
    Schumbi


  4. greebo sagt:

    Okey, wenn man die Lösung kennt, ist es leicht zu googlen. Ich hätte es auch nicht gewusst. Aber zur Ehrenrettung von Ubuntu ;).
    > The „sixth“ field (the rest of the line) specifies the command to be
    > run. The entire command portion of the line, up to a newline or %
    > character, will be executed by /bin/sh or by the shell specified in the
    > SHELL variable of the crontab file. Percent-signs (%) in the command,
    > unless escaped with backslash (\), will be changed into newline charac-
    > ters, and all data after the first % will be sent to the command as
    > standard input. There is no way to split a single command line onto
    > multiple lines, ala the shell’s trailing „\“.
    http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab 5
    Arbeitet also wie spezifiziert ;). Ich würde übrigens statt Backticks $(…) verwenden, Backticks sind irgendwie bäh


  5. matthias sagt:

    @Schumbi: das sollte ich vielleicht mir auch mal angwöhnen. Guter Tipp! Ich saß ja doch recht Lange an dem Problem oben.

    @Greebo: Ja aber auch wirklich nur wenn man die Lößung schon kennt. Wenn nicht ist es etwas komplex 😉 Aber halt auch zum Glück nicht unmöglich!
    kann man die von dir genannte Möglichkeit mit $(..) auch direkt in einem Konsolen Befehl nutzen oder nur in extra Skripten?


  6. greebo sagt:

    Ist wie die Backticks ein Builtin von Bash und Konsorten, siehe

    http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

    3.4.5 Command Substitution
    Dort steht auch nach dem Beispiel, wieso ich Backticks etwas problematisch finde, der kleine Unterschied ist meist nicht gewollt.

Kommentar schreiben

XHTML: Sie können diese Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>