'outputscript | gzip $ file 'não sobrescrevendo $ file

3

Eu tenho um script cron por hora que pega alguma saída (um mysql dump), canaliza-o através do gzip e aponta para sobrescrever um arquivo com o mesmo nome. Quando eu o executo manualmente como root , o arquivo é sobrescrito. Quando ele é executado pelo daemon do cron, o nome do arquivo tem ".1" anexado a ele. Isso continua acontecendo, de modo que depois de um tempo eu tenho muitos arquivos assim:

myfile.gz
myfile.gz.1
myfile.gz.1.1
myfile.gz.1.1.1
myfile.gz.1.1.1.1

e assim por diante.

ps aux|grep crond mostra que o daemon está sendo executado como root .

Eu tentei:

  • renomeando o arquivo original, empurrando a saída e removendo o arquivo antigo após a conclusão, e
  • excluindo o arquivo original antes de enviar a saída

mas não funciona como esperado e eu recebo apenas .1.1.1.1 arquivos.

O script se parece com isso (nada especial) e está localizado em uma caixa do CentOS em /etc/cron.hourly :

#!/bin/bash
DATE='date +%H'
DIR="/abs/path/to/dir"
FILE="hourly-${DATE}.gz"
OPTS="..."
mysqldump $OPTS | gzip -9 > $DIR/$FILE

Alguém pode aconselhar por que esta operação simples não está funcionando como esperado?

    
por Phillip B Oldham 30.10.2009 / 10:45

5 respostas

3

Provavelmente, o seu script foi escrito para usar os recursos do Bash, mas está sendo executado pelo shell Bourne. Você tem #!/bin/bash como a primeira linha do seu script? Por favor, poste-o para que possamos ajudá-lo melhor.

Editar :

Em scripts que devem ser executados como trabalhos agendados, sempre especifico o caminho completo para os programas (como mysqldump e gzip ), pois a variável $ PATH e elementos como aliases serão diferentes daqueles em seu shell interativo. Dessa forma, os resultados são previsíveis.

    
por 30.10.2009 / 11:26
2

Tente adicionar esta linha ao topo do seu script depois da linha de bash

set +C

Isto irá desligar a opção noclobber no bash, então deve sobrescrever o arquivo.

Se não é isso, provavelmente é algo como um alias para o gzip ser definido pelo cron ou pelo ambiente geral.

    
por 30.10.2009 / 14:22
1

Isso parece muito estranho para mim, bash tem uma opção noclobber que faz com que o redirecionamento não sobrescreva um arquivo. Talvez esta seja uma versão recente uma nova opção que é semelhante, mas cria um arquivo .1 em vez disso?

É possível algo como logrotate ser chamado no cronjob, ou algo é executado logo antes dele que move o arquivo (logrotate)? Você deve verificar / etc / crontab e crontab -e executar como root.

Isso está em algum tipo de nuvem ou site de hospedagem compartilhada? Talvez o provedor tenha criado algo que faz isso para ajudar a reduzir a carga do ticket: -)

    
por 30.10.2009 / 12:33
1

Tente definir #!/bin/bash -x a nd write / path / para / bash_script 1 > / path / to / log_file (onde em / path / ... define seu próprio caminho para os arquivos).

    
por 30.10.2009 / 12:36
0

Não é gzip -c ? Essa opção é para gravar para stdout em vez de para um arquivo. Existe um conjunto de variáveis de ambiente GZIP ou GZIP_OPT (com opções gzip)?

    
por 30.10.2009 / 15:31