postmasterをNTサービスにする

initdbpostgresユーザで実行

runasを使って、bash.exeをpostgresユーザで起動する。

$ which bash.exe bash.exeのパスを確認】
/usr/bin/bash.exe
$ cygpath -w /usr/bin/bash bashのパスのWindows表記を確認】
C:\cygwin\bin\bash ⇒拡張子は指定しないと付加されないようだ。
$ cygpath -w /usr/bin/bash.exe bash.exeのパスを拡張子付きで問合せ】
C:\cygwin\bin\bash.exe bash.exeのWindows表記のパス】⇒runasコマンドではこれを使うことにする。
$ whoami 【現在のユーザを確認】
username
$ runas /user:postgres `cygpath -w /usr/bin/bash.exe`
postgres のパスワードを入力してください: 〔ユーザpostgresのパスワードを入力〕
C:\cygwin\bin\bash.exe をユーザー "PCname\postgres" として開始
しています... 【新規の端末のウィンドウが開いた。】


 ここでこの端末を好みの動作設定に調整してしまう。


 好みの設定。

 次回以降も同じ端末になるように。

postgres端末上でinitdbを実行するまで

掃除

 /varディレクトリにあった次の2つを消した(前者が何故出来たか記憶がない)。

原書どおりに

 次のようにして/varディレクトリに新規ディレクトリを作成した。

$ mkdir -p /var/postgresql/data
$ chown postgres /var/postgresql/data

initdb実行

bash-2.05b$ whoami 【postgresユーザであることを確認】
postgres
bash-2.05b$ echo $CYGWIN 環境変数CYGWINに文字列serverがあることを確認】
server
bash-2.05b$ initdb --no-locale -D /var/postgresql/data 【initdb実行】
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale C.

fixing permissions on existing directory /var/postgresql/data... ok
creating directory /var/postgresql/data/base... ok
creating directory /var/postgresql/data/global... ok
creating directory /var/postgresql/data/pg_xlog... ok
creating directory /var/postgresql/data/pg_clog... ok
selecting default max_connections... 40
selecting default shared_buffers... 1000
creating configuration files... ok
creating template1 database in /var/postgresql/data/base/1... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
initializing pg_depend... ok
creating system views... ok
loading pg_description... ok
creating conversions... ok
setting privileges on built-in objects... ok
creating information schema... ok
vacuuming database template1... ok
copying template1 to template0... ok

Success. You can now start the database server using:

/usr/bin/postmaster -D /var/postgresql/data
or
/usr/bin/pg_ctl -D /var/postgresql/data -l logfile start

bash-2.05b$ 【正しく成功したように見える。】

エラーが出て先に進めない

bash-2.05b$ net start postmaster
システム エラー 5 が発生しました。

アクセスが拒否されました。

bash-2.05b$ cygrunsrv -S postmaster
cygrunsrv: Error starting a service: OpenService: Win32 error 5:
アクセスが拒否されました。

bash-2.05b$ sc start postmaster
[SC] StartService: OpenService FAILED 5:

メッセージの通り起動してみる

 上記、initdbの最後に得たメッセージの通りに起動してみた。

bash-2.05b$ /usr/bin/postmaster -D /var/postgresql/data -i
WARNING: dup(0) failed after 3195 successes: Bad file descriptor
LOG: database system was shut down at 2005-07-14 14:09:40
LOG: checkpoint record is at 0/9DDFA0
LOG: redo record is at 0/9DDFA0; undo record is at 0/0; shutdown TRUE
LOG: next transaction ID: 536; next OID: 17142
LOG: database system is ready



ここで止まってしまうので、抜ける際には他のpostgresユーザ端末からkillシグナルを投入してシャットダウンする必要がある。以下、シャットダウンの様子。

LOG: received smart shutdown request
LOG: shutting down
LOG: database system is shut down

 別のpostgresユーザ端末からプロセスをシャットダウンする方法。

bash-2.05b$ head -1 /var/postgresql/data/postmaster.pid
3980 【プロセスID番号取得して…】
bash-2.05b$ kill 3980 【killコマンドで流し込む。】

 このようにして、メッセージの通りにpostgresユーザ端末からpostmasterを直接起動する方法でも、参照WEBに記述されている確認接続はうまくいくようだ。が、…

 …

 …

 …

 エラーは勘違いのようでした。postmasterサービスの発停はpostgresでないユーザ(管理者ユーザ?)行なうもののようです。
 以下、postgresでないユーザにて、幾つかの方法でpostmasterの発停と確認を繰り返したもの。

$ whoami
username

$ net start postmaster
Cygwin PostgreSQL サービスを開始します.
Cygwin PostgreSQL サービスは正常に開始されました。

$ net stop postmaster
Cygwin PostgreSQL サービスを停止中です.
Cygwin PostgreSQL サービスは正常に停止されました。


$ cygrunsrv -S postmaster
$ psql -U postgres template1
Welcome to psql 7.4.5, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit

template1=# \q

$ ipcs
Message Queues:
T ID KEY MODE OWNER GROUP

Shared Memory:
T ID KEY MODE OWNER GROUP
m 1638400 5432001 --rw------- postgres なし

Semaphores:
T ID KEY MODE OWNER GROUP
s 1638400 5432001 --rw------- postgres なし
s 1638401 5432002 --rw------- postgres なし
s 1638402 5432003 --rw------- postgres なし


$ cygrunsrv -E postmaster
$ ipcs
Message Queues:
T ID KEY MODE OWNER GROUP

Shared Memory:
T ID KEY MODE OWNER GROUP

Semaphores:
T ID KEY MODE OWNER GROUP


$ sc start postmaster

SERVICE_NAME: postmaster
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x2
WAIT_HINT : 0x1388
PID : 2904
FLAGS :

$ ls -l /tmp/.s.PGSQL.5432*
srwxrwxrwx 1 postgres なし 51 Jul 14 16:27 /tmp/.s.PGSQL.5432=
-rw------- 1 postgres なし 26 Jul 14 16:27 /tmp/.s.PGSQL.5432.lock

$ netstat -a -n | grep 5432
TCP 0.0.0.0:5432 0.0.0.0:0 LISTENING

$ psql -h localhost -U postgres template1
Welcome to psql 7.4.5, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit

template1=# \q

$ sc stop postmaster

SERVICE_NAME: postmaster
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x2
WAIT_HINT : 0x5208