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

2

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).

    
por Community 07.01.2015 / 11:56

2 respostas

0

Para garantir que o daemon cron esteja em execução e honrando o crontab , você pode fazer um pequeno teste. Edite seu crontab com uma entrada como esta:

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

Após um minuto, verifique o arquivo / tmp / test. Se não houver arquivo, o daemon provavelmente não está sendo executado. Se for esse o caso, eu entraria em contato com o suporte do provedor.

Editar:

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

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

Agora veja o conteúdo do arquivo.

    
por 07.01.2015 / 12:13
0
  1. Execute o script diretamente e verifique se ele funciona.
  2. Algumas das variáveis de ambiente do shell podem não estar disponíveis quando o script está sendo executado no crontab, dependendo de como você configura 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"
    
por 07.01.2015 / 13:19