![pg_dump と rsync バックアップ スクリプトが anacron で動作しない](https://rvso.com/image/1607085/pg_dump%20%E3%81%A8%20rsync%20%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8C%20anacron%20%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84.png)
Z-backup と lb という 2 つの 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 スクリプトは正常に動作します。