PostgreSQLの再起動

PostgreSQLの再起動で、5432ポートがつかめない現象が発生しました。再起動の手順は以下の通り。

$ pg_ctl stop
$ pg_ctl start
bash-2.05$ LOG:  could not bind IPv6 socket: Cannot assign requested address
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
LOG:  could not bind socket for statistics collector: Cannot assign requested address
LOG:  database system was shut down at 2007-03-09 17:08:32 JST
LOG:  checkpoint record is at 1/D6CDC648
LOG:  redo record is at 1/D6CDC648; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 2186724; next OID: 15942897
LOG:  database system is ready

HINTで始まるところでTCP5432ポートがすでにグラブされていて、確保できないと言っています。pg_ctl stopを叩いた時点でpostmasterプロセスはいないことは確認すみ。

stopする前にどうやってpostmasterを起動していたかというと、/etc/rc2.d/pgsqlスクリプト経由で自動起動されています。こんな感じ。

/usr/bin/su - postgres -c "${PGSQL_HOME}/bin/pg_ctl -D ${PGDATA} -l  $PG
DATA/pgsql.log -o '-p ${PGPORT} -i' start"

ちょっと思いついて、su rootしてから/etc/rc2.d/pgsqlスクリプトを使って再起動してみました。

$ su - root
# /etc/rc2.d/pgsql stop
# /etc/rc2.d/pgsql start

こういう手順で再起動すると、5432ポートをちゃんとつかむことが出来ました。"su -c "で起動したプロセスはsuした先のユーザ(この場合postgresユーザ)で動作していると思うんだけど、ポートのコントロールはなぜかrootになっているみたい。全然納得いかないな。うーん、どうしてだろう。