Você precisa especificar o caminho completo para pg_dump
- cron executa seus scripts com um PATH
muito restritivo por padrão.
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
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.
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.
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.
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)
Tags backup cron postgresql