Tarefa do Cron falha ao fazer backup de um banco de dados Postgres

1

Não tenho certeza do que está acontecendo aqui:

Eu tenho um script de backup que roda bem sob a raiz. Ele produz um despejo de banco de dados de > 300kb no diretório adequado.

Ao executá-lo como um cron job com exatamente o mesmo comando, no entanto, um arquivo gzip vazio aparece sem nada nele.

O cron log não mostra nenhum erro, apenas que o comando foi executado.

Este é o script:

#! /bin/bash

DIR="/opt/backup"
YMD=$(date "+%Y-%m-%d")
su -c "pg_dump -U postgres mydatabasename | gzip -6 > "$DIR/database_backup.$YMD.gz" " postgres

# delete backup files older than 60 days
OLD=$(find $DIR -type d -mtime +60)
if [ -n "$OLD" ] ; then
    echo deleting old backup files: $OLD
    echo $OLD | xargs rm -rfv
fi

Quando alterado para:

 pg_dump -U postgres mydatabasename | gzip -6 > "$DIR/database_backup.$YMD.gz"

A mesma coisa acontece.

E a tarefa do cron:

01 10 * * * root sh /opt/daily_backup_script.sh

Produz um arquivo database_backup, apenas um vazio. Alguém sabe o que está acontecendo aqui?

editar:

Ok, simplificado para isso, mas ainda não está funcionando via cron

#! /bin/bash

DIR="/opt/backup"
YMD=$(date "+%Y-%m-%d")

pg_dumpall -U postgres > "$DIR/database_backup.$YMD"

e

01 10 * * * root /opt/daily_backup_script.sh
    
por user705142 04.04.2012 / 07:22

2 respostas

6

Você precisa especificar o caminho completo para pg_dump - cron executa seus scripts com um PATH muito restritivo por padrão.

    
por 04.04.2012 / 07:53
0

Suposições:

Suponho que suas credenciais para o banco de dados de postgresso estejam armazenadas em ~/.pgpass e que as permissões do arquivo estejam definidas como 0600 e que você esteja usando PG* de variáveis de ambiente.

Razão:

A razão pela qual seu comando de backup funciona (cria backup do banco de dados) quando executado a partir do terminal e não está funcionando (cria um arquivo vazio) quando executado a partir do crontab é o ambiente.

Causa:

Quando você executa um comando no crontab, (mesmo quando você o impõe para executá-lo como um usuário desejado (por exemplo, su - root -c 'my_aesome_command' ), as variáveis de ambiente do usuário solicitado são diferentes das variáveis de ambiente definidas quando o usuário está logado terminal.

Solução:

Corrigi esse problema adicionando variáveis de ambiente de usuário específicas ao arquivo /etc/environment executando este comando env >> /etc/environment quando carreguei meu script de backup (na verdade, quando carrego meu contêiner desde que estou trabalhando com o docker)

    
por 09.06.2017 / 17:55