El script de copia de seguridad pg_dump y rsync no funciona en anacron

El script de copia de seguridad pg_dump y rsync no funciona en anacron

Tengo dos scripts sh llamados Z-backup y lb. Z-backup es un script que coloqué en cron.daily para que se ejecute como un trabajo anacron y llame al script lb. El contenido del script Z-backup es:

#!/bin/sh


set -e

# Anacron script to run a daily backup at boot time.

exec /home/chh1/bin/lb >/dev/null 2>&1

exit

El contenido del script lb es:

#!/bin/sh

# Script to do a backup of PostgreSQL database crewdb and /home folder.
# ~/.pgpass file has been created to support pg_dump -w flag.

# The following if statement removes crewdb.backup.sql if it exists.

if [ -e /home/chh1/Dropbox/postgres_backup/crewdb.backup.sql ]
then
    rm /home/chh1/Dropbox/postgres_backup/crewdb.backup.sql
fi >/dev/null 2>&1


echo "PostgreSQL database crewdb backed up on $(date)" >> /home/chh1  
/logs/postgres_bak_log.txt
pg_dump -h localhost -p 5432 -U postgres -d crewdb -w -C -F p -b -v -f    
~/Dropbox/postgres_backup/crewdb.backup.sql >/dev/null 2>&1

echo "Home folder backed up on $(date)" >> /home/chh1   
/logs/home_bak_log.txt
rsync -acu --delete --exclude-from='/home/chh1/rsync_exclude.txt' /home/    
/media/chh1/f86f92f7-bcb4-4b8e-8a64-8a210606d422/home_backup/ >/dev/null    
2>&1


if [ -e /media/chh1/f86f92f7-bcb4-4b8e-8a64-8a210606d422/home_backup   
/chh1/Dropbox/postgres_backup/crewdb.backup.sql ]
then
    rm /media/chh1/f86f92f7-bcb4-4b8e-8a64-8a210606d422/home_backup  
/chh1/Dropbox/postgres_backup/crewdb.backup.sql
fi >/dev/null 2>&1


pg_dump -h localhost -p 5432 -U postgres -d crewdb -w -C -F p -b -v -f    
/media/chh1/f86f92f7-bcb4-4b8e-8a64-8a210606d422/home_backup/chh1/Dropbox   
/postgres_backup/crewdb.backup.sql >/dev/null 2>&1


exit

Si simplemente ejecuto lb en la terminal, el script funciona bien como quiero. (Después de ejecutar lb, ejecuto echo $? y obtengo el estado de salida 0). Sin embargo, el trabajo de Anacron programado solo se ejecuta parcialmente y no puedo entender por qué es así. Se crean las entradas del registro y el comando rsync funciona, por lo que se realiza una copia de seguridad de la carpeta de inicio mediante anacron pero no con pg_dump. Cuando ejecuto los comandos pg_dump en lb y guardo stderr en un archivo como:

pg_dump -h localhost -p 5432 -U postgres -d crewdb -w -C -F p -b -v -f    
~/Dropbox/postgres_backup/crewdb.backup.sql 2>/pg_dump_errors.txt

y

pg_dump -h localhost -p 5432 -U postgres -d crewdb -w -C -F p -b -v -f    
/media/chh1/f86f92f7-bcb4-4b8e-8a64-8a210606d422/home_backup/chh1/Dropbox   
/postgres_backup/crewdb.backup.sql 2>/pg_dump_errors.txt

El archivo /pg_dump_errors.txt genera el mismo resultado para ambos comandos pg_dump y muestra el volcado de la base de datos pero sin errores como

head pg_dump_errors.txt && tail pg_dump_errors.txt

pg_dump: last built-in OID is 16383
pg_dump: reading extensions
pg_dump: identifying extension members
pg_dump: reading schemas
pg_dump: reading user-defined tables
pg_dump: reading user-defined functions
pg_dump: reading user-defined types
pg_dump: reading procedural languages
pg_dump: reading user-defined aggregate functions
pg_dump: reading user-defined operators
pg_dump: creating FK CONSTRAINT "public.timesheet    
          timesheet_date_linkid_fkey"
pg_dump: creating FK CONSTRAINT "public.timesheet   
          timesheet_employee_functionid_fkey"
pg_dump: creating FK CONSTRAINT "public.timesheet 
          timesheet_employeeid_fkey"
pg_dump: creating FK CONSTRAINT "public.work work_categoryid_fkey"
pg_dump: creating FK CONSTRAINT "public.work work_clientid_fkey"
pg_dump: creating FK CONSTRAINT "public.work work_date_linkid_fkey"
pg_dump: creating FK CONSTRAINT "public.work_expenses  
          work_expenses_date_linkid_fkey"
pg_dump: creating FK CONSTRAINT "public.work_expenses 
          work_expenses_employeeid_fkey"
pg_dump: creating FK CONSTRAINT "public.work_expenses 
          work_expenses_expense_categoryid_fkey"
pg_dump: creating FK CONSTRAINT "public.work_expenses   
          work_expenses_workid_fkey"

Mi suposición aquí es que anacron (debido a set -e en Z-backup) no se está ejecutando debido a esto, pero no estoy seguro porque realmente he volcado stderr a /dev/null (en lb). Todos los demás comandos en lb no generan ninguna salida estándar.

Información adicional

-rwxr-xr-x 1 root root 119 Oct 13 13:57 /etc/cron.daily/z-backup
-rwxrwxr-x 1 chh1 chh1 1279 Oct 20 17:26 /home/chh1/bin/lb
-rw------- 1 chh1 chh1 68 Oct 21 06:00 /home/chh1/.pgpass

cat .pgpass
#hostname:port:database:username:password
*:*:crewdb:*:pg#$as(

postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+----------------------- crewdb | postgres | UTF8 | en_NZ.UTF-8 | en_NZ.UTF-8 | =Tc/postgres + | | | | | postgres=CTc/postgres+ | | | | | chh1=CTc/postgres postgres | postgres | UTF8 | en_NZ.UTF-8 | en_NZ.UTF-8 | template0 | postgres | UTF8 | en_NZ.UTF-8 | en_NZ.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_NZ.UTF-8 | en_NZ.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres

sudo cat /etc/postgresql/10/main/pg_hba.conf

# Database administrative login by Unix domain socket
local   all             postgres                                md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer 
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

¿Alguien tiene idea de por qué esto no funciona? ¿Y por qué obtengo salida stderr de pg_dump incluso cuando la copia de seguridad parece funcionar bien? ¡Agradezco mucho cualquier ayuda!

Respuesta1

.pgpasses por usuario. ¿El usuario de Unix que ejecuta el script programado es el mismo usuario que prueba el script manualmente?

¿Y por qué obtengo salida stderr de pg_dump incluso cuando la copia de seguridad parece funcionar bien?

Por la -vopción. Debe eliminarlo y también eliminar los >/dev/null 2>&1que hacen que desaparezcan los mensajes de error potencialmente útiles, incluso en la llamada superior.

Respuesta2

La respuesta es cambiar pg_hba.conf a:

sudo grep ^[^#] /etc/postgresql/10/main/pg_hba.conf
[sudo] password for chh1: 
local   all             all                                     trust 
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 md5
local   replication     all                                     md5
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

Ahora el script anacron funciona bien.

información relacionada