![Pg_dump 및 rsync 백업 스크립트가 anacron에서 작동하지 않습니다.](https://rvso.com/image/1607085/Pg_dump%20%EB%B0%8F%20rsync%20%EB%B0%B1%EC%97%85%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20anacron%EC%97%90%EC%84%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
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 스크립트가 제대로 작동합니다.