Por que meu cronjob não executa meu shell script?

Por que meu cronjob não executa meu shell script?

Eu tenho um crontab que cria um dump do meu banco de dados todas as noites:

20 3 * * * /path/to/dailydump.sh

dailydump.shcontém:

#!/bin/sh

DATENAME=`date +%Y%m%d`

BASENAME="/path/to/dumps/db_${DATENAME}.sql"

/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME}

As permissões são:

-rwx---r-x 1 ... dailydump.sh
drwxr-xrwx 2 ... dumps

Por que meu cronjob não funciona?

Estou em um servidor compartilhado sem acesso root. Não há logins /var/log/cronou arquivos /var/log/syslog. Não há mail em /var/mail/<user_name>or /var/spool/mail/<user_name>(na verdade não há nada em /var/mail/and /var/spool/), [email protected]não envia nenhuma mensagem de erro e 1 2 * * * /path/to/your/command &>/path/to/mycommand.lognão salva nenhum arquivo de log. ps -ef | grep cron | grep -v grep?não retorna nada. (Verhttps://serverfault.com/a/449652)

Toda a configuração funcionou bem até que movi todos os arquivos para um novo domínio e tive que configurar um novo crontab. (Sim, atualizei todos os caminhos e as informações de login do banco de dados. Também verifiquei várias vezes.) Estou com o mesmo provedor de hospedagem na mesma máquina, portanto o ambiente não mudou.

Qualquer ajuda seria muito apreciada.


"Solução"

Ok, isso é muito estranho. A central de ajuda do meu provedor diz que se o script a ser executado por um cronjob estiver dentro de um diretório protegido por senha, preciso adicionar -auth=user:password -sourceantes o caminho para o script. Então adicionei isso (com a autenticação adequada):

20 3 * * * -auth=user:password -source /path/to/dailydump.sh

O resultado foi queuma mensagem de erro foi enviada para mim por e-mail(assim MAILTO=funciona), me contando /bin/sh: -=: invalid optione listando as opções disponíveis. O exemplo na central de ajuda não fornecia realmente um caminho físico ( /path/to/file), mas uma URL ( http://...), então excluí authe sourcesalvei novamente o crontab, eagora a porra do cronjob é executado!!'O crontab parece exatamente como antes, char por char, mas agora ele é executado, sem alterações aparentes no código.

Não tenho ideia de qual era o problema, mas inserir o código errado e excluí-lo novamente resolveu o problema. o_O Parece que o cronjob realmentefezexecutado o tempo todo (porque quando isso não acontece, obviamente gera um erro), apenas queNão fez nada!Muito misterioso. Se alguém puder me explicar isso (de forma reproduzível), oferecerei uma recompensa de 200 e a recompensarei (após a espera necessária de dois dias).

Além disso, @chaos me deu outra solução, evitando completamente o shell script e deixando o cron despejar o banco de dados diretamente (veja os comentários à sua resposta abaixo):

20 3 * * * /usr/bin/mysqldump -hhost -uusername -ppassword nome do banco de dados > /caminho/para/dumps/db_$(data +\%Y\%m\%d).sql

Só não se esqueça de escapar dos sinais de porcentagem, ou o script encontrará um "EOF inesperado".

Obrigado a todos pela sua ajuda. Aprendi muito novamente (embora não seja o que estava errado aqui).

Responder1

Para ter certeza de que o crondaemon está rodando e respeitando o crontab, você pode fazer um pequeno teste. Edite seu crontabcom uma entrada como esta:

* * * * * /bin/date >>/tmp/test

Depois de um minuto, verifique o arquivo /tmp/test. Se não houver nenhum arquivo, o daemon provavelmente não está em execução. Se for esse o caso, entraria em contato com o suporte do provedor.

Editar:

Para determinar o ambiente na instância cron você:

* * * * * /usr/bin/id >>/tmp/test
* * * * * /usr/bin/env >>/tmp/test

Agora veja o conteúdo do arquivo.

Responder2

  1. Execute o script diretamente e verifique se funciona.
  2. Algumas variáveis ​​de ambiente do shell podem não estar disponíveis quando o script está sendo executado no crontab, dependendo de como você configurou o script.

Tente modificar o script para testar se as variáveis ​​de ambiente são o problema:

sh --login -c "/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME} >  /path/to/LogFile.txt 2>&1"

informação relacionada