Escapar de personajes en cron


9

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:


13

Ampliaré lo que dijo SvenW al afirmar que pondría este comando en un script por dos razones:

  1. Evita cualquier problema con los caracteres de escape en crontab.
  2. Le permite indicar claramente a sus colegas administradores qué hace el trabajo sin desperdiciar ninguno de sus ciclos, descifrando la magia de una línea que ha creado. Tal como llamar al guión /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! :)

2
Felicitaciones por "¡qué diablos estabas pensando dentro de un año!".
Tonny

5

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.


5

La razón por la que no funciona es que cronno lo es bash. 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.