Escapando caracteres no cron

9

O seguinte funciona como esperado no prompt de comando. Mas isso não funciona no 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

Estou tendo o erro a seguir:

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

Alguns caracteres precisam ser escapados no cron? Ou é um problema com o subshell no cron?

shantanuo
fonte
Duplicado de serverfault.com/questions/274475/… ?
Hubbitus

Respostas:

13

Vou expandir o que o SvenW disse, afirmando que eu colocaria esse comando em um script por dois motivos:

  1. Evita qualquer problema com caracteres de escape no crontab.
  2. Ele permite que você indique claramente aos colegas administradores o que o trabalho faz sem desperdiçar nenhum ciclo descriptografando a mágica de uma linha que você criou. Como chamar o script /root/bin/dump_mysql_tables_and_email_failure_report.sh. Você pode não estar em um ambiente com outros administradores, mas isso servirá para lembrá- lo de que diabos você estava pensando daqui a um ano! :)
Kyle Smith
fonte
2
Parabéns pelo "que diabos você estava pensando daqui a um ano!".
Tonny
5

A solução mais fácil para problemas de escape do cron: Coloque o comando em seu próprio script de shell e chame esse script do cron.

Sven
fonte
5

A razão pela qual não funciona é que cronnão é bash. Criar um subshell usando colchetes faz parte da sintaxe do bash. Uma pista para isso está na primeira "palavra" da mensagem de erro.

Os backticks trabalhariam para criar um subshell, exceto que você já está usando backticks dentro do subshell, para que não possa usá-los novamente.

Como os outros já disseram, escreva um script e chame isso de cron.

Ladadadada
fonte