Pg_dump 및 rsync 백업 스크립트가 anacron에서 작동하지 않습니다.

Pg_dump 및 rsync 백업 스크립트가 anacron에서 작동하지 않습니다.

Z-backup과 lb라는 두 개의 sh 스크립트가 있습니다. Z-backup은 cron.daily에 배치한 스크립트이므로 anacron 작업으로 실행되고 lb 스크립트를 호출합니다. Z-backup 스크립트의 내용은 다음과 같습니다.

#!/bin/sh


set -e

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

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

exit

lb 스크립트의 내용은 다음과 같습니다.

#!/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

터미널에서 lb를 실행하면 스크립트가 원하는 대로 제대로 작동합니다. (lb를 실행한 후 echo $?를 실행하고 종료 상태가 0이 됩니다). 그러나 예약된 anacron 작업은 부분적으로만 실행되며 이것이 왜 발생하는지 알 수 없습니다. 로그 항목이 생성되고 rsync 명령이 작동하므로 홈 폴더는 anacron을 통해 백업되지만 pg_dump는 백업되지 않습니다. lb에서 pg_dump 명령을 실행하고 stderr을 다음과 같은 파일에 저장하면:

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

그리고

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

/pg_dump_errors.txt 파일은 두 pg_dump 명령에 대해 동일한 출력을 생성하고 데이터베이스 덤프를 표시하지만 다음과 같은 오류는 없습니다.

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"

여기서 내 가정은 anacron(Z-backup의 set -e로 인해)이 이로 인해 실행되지 않지만 stderr을 /dev/null(lb 단위)에 실제로 덤프했기 때문에 확실하지 않다는 것입니다. lb의 다른 모든 명령은 stderr 출력을 생성하지 않습니다.

추가 정보

-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

이것이 작동하지 않는 이유를 아는 사람이 있습니까? 그리고 백업이 제대로 진행되는 것처럼 보이는데도 pg_dump에서 stderr 출력을 얻는 이유는 무엇입니까? 어떤 도움이라도 주셔서 감사합니다!

답변1

.pgpass사용자별입니다. 예약된 스크립트를 실행하는 Unix 사용자는 스크립트를 수동으로 테스트하는 사용자와 동일한 사용자입니까?

그리고 백업이 제대로 진행되는 것처럼 보이는데도 pg_dump에서 stderr 출력을 얻는 이유는 무엇입니까?

옵션 때문입니다 -v. 이를 제거해야 하며 >/dev/null 2>&1상위 호출자를 포함하여 잠재적으로 유용한 오류 메시지가 사라지게 하는 원인도 제거해야 합니다.

답변2

대답은 pg_hba.conf를 다음으로 변경하는 것입니다.

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

이제 anacron 스크립트가 제대로 작동합니다.

관련 정보