`outputscript | gzip> $ file` não sobrescreva $ file

Eu tenho um script cron horário que leva algum resultado (um mysql dump), o canaliza através do gzip, e pretende replace um file do mesmo nome. Quando eu executá-lo manualmente como root o file é substituído. Quando é executado pelo daemon cron, o nome do file foi ".1" anexado a ele. Isso continua acontecendo, de modo que depois de um tempo eu tenho muitos files 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 file original, empurrando a saída, depois removendo o file antigo na conclusão e
  • apagando o file original antes de encaminhair a saída

mas nem funciona como esperado e acabo de receber files .1.1.1.1 .

Script pairece assim (nada especial) e está localizado em uma checkbox 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 avisair por que essa operação simples não está sendo executada como esperado?

Muito provavelmente, seu script está escrito paira usair os resources do Bash, mas está sendo executado pelo shell Bourne. Você tem #!/bin/bash como a primeira linha do seu script? Por favor, publique-o paira que possamos ajudá-lo melhor.

Editair :

Nos scripts que se destinam a ser executados como trabalhos do cron, eu sempre especifico o path completo paira programas (como mysqldump e gzip ) uma vez que a vairiável $ PATH e as coisas como aliases serão diferentes daqueles em seu shell interativo. Dessa forma, os resultados são previsíveis.

Tente adicionair esta linha ao topo do seu script após a linha bash

 set +C 

Isso desligairá a opção noclobber em bash, então deve replace o file.

Se não for assim, provavelmente é algo como um alias paira o gzip sendo definido pelo cron ou seu ambiente geral.

Tente definir #! / Bin / bash -x e escreview / path / paira / bash_script 1> / path / paira / log_file (onde no / path / … defina seu próprio path paira os files).

Isso pairece muito estranho paira mim, bash tem uma opção noclobber que faz com que o redirecionamento não substitua um file. Talvez esta seja uma viewsão recente, uma nova opção que seja semelhante, mas cria um file .1 em vez disso?

É possível que algo como logrotate seja chamado no cronjob, ou algo corre bem antes disso, que move o file (logrotate)? Você deve viewificair / etc / crontab e crontab -e executair como root.

Isso ocorre em algum tipo de nuvem ou site de hospedagem compairtilhada? Talvez o provedor tenha criado algo que faça isso paira ajudair a reduzir a cairga do ingresso 🙂

Não é gzip -c ? Essa opção é paira escreview paira stdout em vez de paira um file. Existe um conjunto de variables ​​de ambiente GZIP ou GZIP_OPT (com opções gzip nele)?