Por que este comando não funciona como um cronjob, enquanto funciona perfeitamente quando digitado em um shell? [fechadas]

4

Se eu executar este comando a partir do shell, ele funcionará como esperado:

cd ~ && mysqldump --databases --skip-dump-date --host=localhost --user=admin --password=xxxxx --lock-all-tables --result-file=xxxxx_dump_tmp.sql mydb && gzip xxxxx_dump_tmp.sql && mv xxxxx_dump_tmp.sql.gz xxxxx_dump_'date +"%Y-%m-%d__%H.%M.%S"'.sql.gz

No entanto, se eu configurar um cronjob com o mesmo comando exato (copiar-colado), ele falhará com os seguintes erros (recebo a notificação por email):

/bin/sh: -c: line 0: unexpected EOF while looking for matching '''
/bin/sh: -c: line 1: syntax error: unexpected end of file

O que há de errado?

    
por matteo 16.03.2013 / 11:38

2 respostas

12

What's wrong?

De acordo com man 5 crontab :

«…

The "sixth" field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile. Percent-signs (%) in the command, unless escaped with backslash (), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

… », você simplesmente escreveu errado. Então, para crontab, deve ser escrito como date +"\%Y-\%m-\%d__\%H.\%M.\%S"

    
por 16.03.2013 / 14:19
5
  1. Não coloque um comando complexo como este diretamente no arquivo crontab.
    Coloque-o em um script e chame o script do cron.

    Por padrão, as tarefas cron são executadas por sh (a menos que seja configurado de outra forma). Quando você passa por um script, pode definir o shell apropriado para usar, colocando um #!/bin/bash ou algo ao longo dessas linhas na primeira linha do script.

  2. cd ~ é perigoso pra caramba. Depende totalmente de sob qual userid o crontab está rodando. Não necessariamente o seu próprio userid!
    Portanto, use cd ~userid .

  3. Se o cron for executado como um usuário diferente, esse usuário poderá acessar seu diretório pessoal? E esse usuário tem o mesmo ambiente da sua conta? Veja também 4.

  4. O cron-jobs é iniciado sem carregar o ambiente normal. Portanto, muitas variáveis do ambiente normal (como $PATH ) não existem ou apenas contêm informações limitadas. Isso pode fazer com que programas chamados do cron falhem. Veja também o item 1. Você pode ter que chamar explicitamente seu .bashrc (ou qualquer outro script de inicialização que você normalmente usa) para configurar o ambiente apropriado para qualquer outra coisa que você colocar em seu script chamado cron.

por 16.03.2013 / 12:00

Tags