Fluchtzeichen in cron

9

Das Folgende funktioniert wie erwartet an der Eingabeaufforderung. Aber es funktioniert nicht von Cron.

mysqldumpslow <(tail -1000 `mysqladmin variables \
    | grep slow_query_log_file | awk '{print $4}'`) \
    | mail -s "slow log from `hostname` sorted by time" shantanu.oak`hostname`@gmail.com \
    > /root/slow_succ.txt 2> /root/slow_err.txt

Ich erhalte folgenden Fehler:

/bin/sh: -c: line 0: syntax error near unexpected token `('

Müssen bestimmte Charaktere in cron entkommen? Oder ist es ein Problem mit Subshell in Cron?

Shantanuo
quelle
Duplikat von serverfault.com/questions/274475/… ?
Hubbitus

Antworten:

13

Ich werde das, was SvenW gesagt hat, erweitern, indem ich erkläre , dass ich diesen Befehl aus zwei Gründen in ein Skript einfügen würde:

  1. Es vermeidet Probleme mit entkommenen Zeichen in crontab.
  2. Auf diese Weise können Sie Ihren Administratoren klar anzeigen, was der Job tut, ohne einen ihrer Zyklen damit zu verschwenden, die von Ihnen erstellte Einzeiler-Magie zu entschlüsseln. Zum Beispiel das Skript aufrufen /root/bin/dump_mysql_tables_and_email_failure_report.sh. Sie befinden sich möglicherweise nicht in einer Umgebung mit anderen Administratoren, aber dies wird Sie daran erinnern , was zum Teufel Sie in einem Jahr gedacht haben! :) :)
Kyle Smith
quelle
2
Ein großes Lob für das "Was zum Teufel hast du in einem Jahr gedacht!".
Tonny
5

Die einfachste Lösung für Cron-Fluchtprobleme: Fügen Sie den Befehl in ein eigenes Shell-Skript ein und rufen Sie dieses Skript einfach von Cron aus auf.

Sven
quelle
5

Der Grund , es nicht funktioniert , ist , dass cronnicht bash. Das Erstellen einer Unterschale mit Klammern ist Teil der Bash-Syntax. Ein Hinweis darauf ist im ersten "Wort" der Fehlermeldung.

Backticks würden funktionieren, um eine Subshell zu erstellen, außer dass Sie bereits Backticks in Ihrer Subshell verwenden, sodass Sie diese nicht mehr verwenden können.

Wie die anderen bereits gesagt haben, schreiben Sie ein Skript und nennen Sie das von cron.

Ladadadada
quelle