Eu tenho um crontab que cria uma cópia do meu banco de dados toda noite:
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?
Eu estou em um servidor compartilhado sem acesso root. Não há registros em /var/log/cron
ou /var/log/syslog
. Não há email em /var/mail/<user_name>
ou /var/spool/mail/<user_name>
(na verdade, não há nada em /var/mail/
e /var/spool/
), [email protected]
não envia mensagens de erro nem 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. (Veja link )
Toda a configuração funcionou bem até que eu 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, para que o ambiente não tenha mudado.
Qualquer ajuda seria muito apreciada.
"Solução"
Ok, isso é muito estranho. O centro 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, eu preciso adicionar -auth=user:password -source
antes do caminho para o script. Então eu adicionei isso (com a autenticação adequada):
20 3 * * * -auth=user:password -source /path/to/dailydump.sh
O resultado foi que uma mensagem de erro foi enviada por e-mail para mim (então MAILTO=
funciona), informando /bin/sh: -=: invalid option
e listando as opções disponíveis. O exemplo na Central de Ajuda não forneceu um caminho físico ( /path/to/file
), mas uma URL ( http://...
), então excluí novamente auth
e source
e salvei o crontab e agora f% § # ing cronjob é executado !! 'O crontab é exatamente como antes, char para char, mas agora roda, sem mudanças aparentes no código.
Eu não tenho idéia do problema, mas inserir código errado e excluí-lo novamente funcionou. o_O Parece como se o cronjob realmente tivesse executado o tempo todo (porque quando isso não acontece, obviamente lança um erro), só que ele não fez nada! Muito misterioso . Se alguém puder explicar isso para mim (de uma maneira reproduzível), ofereço uma recompensa de 200 e recomendo (após a espera necessária de dois dias).
Além disso, o @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 para a sua resposta abaixo):
20 3 * * * /usr/bin/mysqldump -hhost -uusername -ppassword databasename > /path/to/dumps/db_$(date +\%Y\%m\%d).sql
Não se esqueça de escapar dos sinais de porcentagem, ou o script encontrará um "EOF inesperado".
Obrigado a todos pela sua ajuda. Eu aprendi muito novamente (embora não o que estava errado aqui).