
Eu tenho um crontab que cria um dump do meu banco de dados todas as noites:
20 3 * * * /path/to/dailydump.sh
dailydump.sh
conté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/cron
ou 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.log
nã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 -source
antes 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 option
e 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í auth
e source
salvei 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 cron
daemon está rodando e respeitando o crontab
, você pode fazer um pequeno teste. Edite seu crontab
com 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
- Execute o script diretamente e verifique se funciona.
- 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"