今回はコマンド(実行ファイル)が格納されるディレクトリについて。
とはいえパッケージでインストールしているので
Ubuntu ベースの話になります。
initdb や vacuumdb、psql など PostgreSQL の主なコマンドは 以下のディレクトリに格納されます。
/usr/lib/postgresql/9.1/bin
$ ls -F /usr/lib/postgresql/9.1/bin
clusterdb* pg_basebackup* pg_upgrade*
createdb* pg_controldata* postgres*
createlang* pg_ctl* postmaster@
createuser* pg_dump* psql*
dropdb* pg_dumpall* reindexdb*
droplang* pg_resetxlog* vacuumdb*
dropuser* pg_restore*
initdb* pg_test_fsync*
複数のバージョンが 1 つのマシンで稼動することがあるため コマンドも複数のバージョンが格納できるように サブディレクトリが分かれます。
ただ、実際は /usr/lib/postgresql/9.1/bin には パスが通っておらず /usr/bin 以下にあるリンクファイルを起動することになります。
/usr/bin
$ ls -F /usr/bin (PostgreSQL 関連のみ抜粋) clusterdb@ pg_basebackup@ pg_lsclusters@ createdb@ pg_config@ pg_restore@ createlang@ pg_createcluster@ pg_upgradecluster@ createuser@ pg_ctlcluster@ psql@ dropdb@ pg_dropcluster@ reindexdb@ droplang@ pg_dump@ vacuumdb@ dropuser@ pg_dumpall@ vacuumlo@
このように /usr/bin/ 以下のコマンドはリンクになっています。
(例外として initdb はリンクがありません)
$ readlink -f /usr/bin/vacuumdb /usr/share/postgresql-common/pg_wrapper
また、各コマンドは直接 /usr/lib/postgresql/9.1/bin 以下の ファイルにリンクするのではなく 以下のファイルにリンクしています。
/usr/share/postgresql-common/pg_wrapper
pg_wrapper は Perl のスクリプトです。
$ file /usr/share/postgresql-common/pg_wrapper
/usr/share/postgresql-common/pg_wrapper: Perl script, ASCII text executable
前述したように 1つのマシン内で複数のバージョンが稼動することができるため 一旦この pg_wrapper で、コマンドを受けて、環境変数などから適切なバージョンの コマンドを起動するようになっているわけです。
もしかして参考になる人もいるかもしれないの書いておきます。
情報処理技術者試験は、高度試験に合格するか、高度試験の午前Iに通過すると その後2年間、午前Iを免除してもらえます。
『午前Iが免除の試験で合格した』場合も その試験から2年間免除されるのか気になりました。
案内には「高度試験を合格した」と書いてあるだけなので いけそうな気はしたのですが 『午前Iを受けてない試験』で次の午前Iが免除になるのも 不思議な気がしたわけです。
情報処理技術者試験センターに電話で質問です。
結果は『免除の試験とか関係なく、高度試験に合格したら 2年間午前Iが免除』とのことでした。