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
.pgpass
es 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 -v
opción. Debe eliminarlo y también eliminar los >/dev/null 2>&1
que 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.