Escapando caracteres no cron

9

O seguinte funciona conforme o 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

Eu recebo o seguinte erro:

/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?

    
por shantanuo 09.03.2012 / 13:05

3 respostas

13

Expandirei o que SvenW disse afirmando que eu colocaria este 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 seus colegas administradores o que o trabalho faz sem perder nenhum dos ciclos deles, 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 lembrar você o que diabos você estava pensando daqui a um ano! :)
por 09.03.2012 / 13:11
5

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

    
por 09.03.2012 / 13:08
5

O motivo pelo qual isso não funciona é que cron não é bash . Criar um subshell usando colchetes faz parte da sintaxe bash. Uma pista para isso está na primeira "palavra" da mensagem de erro.

Backticks trabalharia para criar um subshell, exceto que você já está usando backticks dentro do seu subshell, então você não pode usá-los novamente.

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

    
por 09.03.2012 / 13:17

Tags