mixiに書いたのだけどおなじことをこっちにも書いておきます。
最近客先でPostgreSQLが突然落ちるって話があり、その顛末などをマネージャから聞きました。とりあえず再現方法がわかったので対処法も決まったそうなのだけど、面白そうなお話だったのでごくごくほんの少しだけ深追いしてみました。
で、僕は
- /bin/shを捨てる
っていうのが実は正しいんじゃないかとひそかに思ってるのですがどうなんでしょ?
確か去年あたり、Linuxで書いたシェルスクリプトが動かなかったのでなんでだって調べたら/bin/bashな文法が含まれてたのが原因じゃないかみたいなことがありました。*1
cshを使っちゃいけないっていう話は聞きますけどbashを使うなという話は聞いたことがないです。
もちろん、そんないい加減な書き方するから悪いとかそもそも実機でテストしなかったのがまずいという話なんでしょうけれども、なんかもうそんなシェル捨ててしまえって気分になってしまいます...
SolarisのLinux化なんて話があるそうですが、その辺とかどうなるんでしょう? 気になるところです。
- 問題
- PostgreSQLが突然落ちる
- デバックログを見ると、何者かがシグナルを発しそれを受けて落ちた模様...
- PostgreSQLが突然落ちる
- 環境
- OS
- Solaris(ならなんでもいいはず)
- PostgreSQL
- 多分こっちもバージョンは関係ない
- 準備
- PostgreSQL用の起動スクリプトを準備しておく
- pg_ctl経由で起動させるようにする
- PostgreSQL用の起動スクリプトを準備しておく
- 再現方法
- ログイン(デーモン動かすから多分rootで)し端末で実行してるシェルを/bin/shにする*2
- 用意したPostgreSQL用起動スクリプトを実行する
- 起動してプロセスがいることを確認する
- おもむろに起動した端末でctrl-cを押下
- プロセスを確認する
- PostgreSQLが落ちていることを確認できる
- ちなみにどうしたいか
- 問題は解決してるそうなので、とりあえずなぜそうなっているのか詳しいメカニズムを知りたい
- 今わかっていること
- どうやら昔のUnixの下位互換等の理由により/bin/shはジョブコントロールできないようだ
- Kernighan/Pike の「UNIX プログラミング環境(邦訳版 pp.336)」にも載っているメジャーなイディオムであるらしい
- お勉強しないといけない分野がまた増えましたwww
- backend/oistmaster/postmaster.cをざっと見ると*3、SIGINTがきたときの処理っぽいのがあった
- pg_ctlはよくわからない...*4
- なんでpg_ctlだとSIGINTを拾ってpostmasterだとSIGINTを拾わないかの理由がわからない
- でも、/bin/shに絡むことは間違いなさそうな気がする...
- 参考までに