Gbak não executa pelo crontab

Iniciado por PCPedroso, 02 de Dezembro de 2010, 15:18

tópico anterior - próximo tópico

PCPedroso

Olá, andei pesquisando pelo forum e encontrei duas ocorrências parecidas com a minha situação, e obviamente não solucionaram meu problema.
O que acontece é o seguinte, tenho um scrip que faz um gbak no banco de dados que se rodado manualmente funciona corretamente, mas quando passo ele para o crontab não fuinciona a parte do gbak, deixei o script bem simples.

#! /bin/bash
# backup.sh

gbak -v -b /home/dados/dados.fdb /home/backup/dados.fbk -user sysdba -password masterkey
tar -cvzf /home/backup/dados.tar.gz dados.fbk


# crontab
...
1 10 * * * root /home/scripts/backup.sh


Pelo crontab ele cria o dados.tar.gz zerado, na verdade o que ele gera é um .fbk zerado, pois rodei o script manualmente com a linha do tar em comentario e em seguida fiz com que o crontab disparace o mesmo script, apenas inverti o comentario das linhas, e o arquivo foi compactado corretamente.

zekkerj

O cron executa os comandos com um ambiente (ENVIRONMENT) restrito. Em especial, o caminho de busca de comandos (variável de ambiente PATH) é resetado para o mínimo (/bin:/usr/bin).
Se o programa depende de alguma variável de ambiente, ou se estiver fora dessas duas pastas, vc vai ter problemas.

Pra contornar isso, coloque no início do seu script o valor das variáveis que vai funcionar, ou inclua explicitamente o arquivo /etc/profile, algo assim:

#!/bin/bash

. /etc/profile

bla-bla-bla
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

PCPedroso

Obrigado pela resposta zekkerj..!
Talvez não tenha feito corretamente ou não entendi, mas não consegui fazer funcionar com a sua dica.
Eu até consegui fazer o que eu precisava, mas não ficou nada "elegante", pois eu inseri o comando do gbak diretamente no crontab, ele consegue rodar, como no ex abaixo.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
1 10 * * * root gbak -b /home/dados/dados.fdb /home/backup/dados.fbk -user sysdba -pass masterkey && /home/scripts/backup.sh


E no meu script ficou apenas a parte de compactar o banco arquivo gerado pelo gbak.
Mas ainda não acho que realmente seja a solução, por isso ainda não vou dar como resolvido o meu problema, vou continuar a busca, e assim que coseguir eu posto aqui, e se alguem tiver outra dica, por favor poste tambem.

Obs. Talvez nem todos coneçam o gbak, então vou dizer basicamente o que ele faz.
O gbak é um utilitário do firebird, que serve para fazer backups do bancod de dados, muito utilizado pois os usuarios podem estar utilizando o banco no momento do backup, sem problemas, entre outros.

zekkerj

Pegue essa linha "PATH" e coloque no seu script, assim vc vai conseguir executar os comandos corretamente.

PS: Que comando gbak é esse? Aqui não tem nem pra instalação no repositório.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

PCPedroso

Se não estou enganado acho que ja tinha colocado a linha do PATH no meu script, mas vou tentar novamente, vlw.

PS: O gbak é um utilitario que vem junto com o firebird, que no mometo da instalação do pacote é colocada na pasta /usr/bin

PCPedroso

Pois é, não funcionou colocando a linha PATH no meu script, e ainda esta da mesma forma, manualmente o script vai que vai!! e a luta continua.

zekkerj

O programa gbak pode ser outro script, que depende do PATH pra funcionar. Experimente colocar a linha abaixo em seu script, também, logo após a definição do PATH:

export PATH

Isso faz com que o valor atual do PATH seja repassado pros processos filhos.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

PCPedroso

Coloquei o export PATH, mas ainda não foi, estou baixando nova versão do ubuntu, e vou ver o que acontece, pois já havia feito este tipo de backup em outra distribuição linux a algum tempo atras, e não tive problema algum.
Agradeço pela ajuda, caso funcione eu informo aqui.

Kriptolix

cara, eu uso um script semelahnte ao seu com o gbak e funciona normalmente, mas quando vou usal-lo eu coloco o caminho todo do arquivo da seguinte forma

opt/firebird/bin/gbak b /home/dados/dados.fdb /home/backup/dados.fbk -user sysdba -password masterkey

engraçado que tambem tive problemas pra faze-lo rodar inicialmente no cron, nao lembro o por que, mas é bom vc verificar a permissao de execuçao do arquivo, da pasta do banco e o do arquivo banco. para testar o cron recomendo criar um script com o codigo abaixo e coloca-lo no cron (no mesmo ou horario ou nao do bakup) pra ver se ele roda normal.


#! /bin/bash

echo funciona >> /home/$USER/arqtest.txt



se rodar é por que o problema é no script backup, senao é na sua configuraçao do cron mesmo.
caso nao resova eu passo o meu script (esta num servidor ao qual so tenho acesso na semana, e a copia esta com um amigo) e o meu crontab e agente ve onde mora o erro. uma pergunta: que horas vc setou mesmo? foi 10:01? por que se foi esta faaltando um zero a esqueda na primeira coluna (nao sei se tem diferença).
Ubuntu Linux 10.10

lopesadv

PCPedroso, percebi que o seu arquivo "backup.sh" invoca o tar logo após o comando gbak. Se o tar está gerando um arquivo zerado, provavelmente é porque o tar está sendo executado antes de o gbak transferir os arquivos de /home/dados para /home/backup. O seu relato aponta para isso, ou seja, o crontab está invocando o seu backup.sh em sequência, sem aguardar a cópia pelo gbak. Talvez você deva configurar o "sistema" para realizar o empacotamento algum tempo depois de executada a cópia pelo gbak. Para isso, você pode adicionar, no seu arquivo backup.sh, entre as linhas "gbak -v -b /home/dados/dados.fdb /home/backup/dados.fbk -user sysdba -password masterkey" e "tar -cvzf /home/backup dados.tar.gz dados.fbk" uma pausa pelo tempo suficiente para a realização da cópia pela gbak (talvez você use o comando sleep). Ou então você pode criar um arquivo só para o gbak e outro só para o tar e, no crontab, você pode configurá-lo para chamar o arquivo do tar algum tempo após a execução do gbak. De repente você crie um script que "veja" que o gbak concluiu a cópia para só então acionar o tar.
Espero que possa aproveitar a ideia.
Abraços.