Lo siguiente funciona como se espera del símbolo del sistema. Pero no funciona desde 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
Obtuve el siguiente error:
/bin/sh: -c: line 0: syntax error near unexpected token `('
¿Es necesario escapar de ciertos caracteres en cron? ¿O es un problema con subshell en cron?
Respuestas:
Ampliaré lo que dijo SvenW al afirmar que pondría este comando en un script por dos razones:
/root/bin/dump_mysql_tables_and_email_failure_report.sh
. Puede que no sea en un entorno con otros administradores, pero esto va a servir para recordar que qué diablos estabas pensando un año a partir de ahora! :)fuente
La solución más fácil para los problemas de escape de cron: coloque el comando en su propio script de shell y simplemente llame a este script desde cron.
fuente
La razón por la que no funciona es que
cron
no lo esbash
. Crear una subshell usando paréntesis es parte de la sintaxis bash. Una pista de esto está en la primera "palabra" del mensaje de error.Los backticks funcionarían para crear una subshell, excepto que ya está utilizando backticks dentro de su subshell, por lo que no puede volver a usarlos.
Como los otros ya han dicho, escribe un guión y llámalo desde cron.
fuente