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?
Antworten:
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:
/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! :) :)quelle
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.
quelle
Der Grund , es nicht funktioniert , ist , dass
cron
nichtbash
. 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.
quelle