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?


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! :)

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.