PostgreSQLが突然落ちた件について

mixiに書いたのだけどおなじことをこっちにも書いておきます。
最近客先でPostgreSQLが突然落ちるって話があり、その顛末などをマネージャから聞きました。とりあえず再現方法がわかったので対処法も決まったそうなのだけど、面白そうなお話だったのでごくごくほんの少しだけ深追いしてみました。
で、僕は

っていうのが実は正しいんじゃないかとひそかに思ってるのですがどうなんでしょ?

確か去年あたり、Linuxで書いたシェルスクリプトが動かなかったのでなんでだって調べたら/bin/bashな文法が含まれてたのが原因じゃないかみたいなことがありました。*1
cshを使っちゃいけないっていう話は聞きますけどbashを使うなという話は聞いたことがないです。
もちろん、そんないい加減な書き方するから悪いとかそもそも実機でテストしなかったのがまずいという話なんでしょうけれども、なんかもうそんなシェル捨ててしまえって気分になってしまいます...
SolarisLinux化なんて話があるそうですが、その辺とかどうなるんでしょう? 気になるところです。

  • 問題
    • PostgreSQLが突然落ちる
      • バックログを見ると、何者かがシグナルを発しそれを受けて落ちた模様...
  • 環境
OS
Solaris(ならなんでもいいはず)
PostgreSQL
多分こっちもバージョンは関係ない
  • 再現方法
    1. ログイン(デーモン動かすから多分rootで)し端末で実行してるシェルを/bin/shにする*2
    2. 用意したPostgreSQL用起動スクリプトを実行する
    3. 起動してプロセスがいることを確認する
    4. おもむろに起動した端末でctrl-cを押下
    5. プロセスを確認する
    6. 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に絡むことは間違いなさそうな気がする...
      • tcshbashで同じ事を試したら再現しなかったそうな...
  • 参考までに
    • この問題は、起動スクリプトに親シェルが/bin/shなら起動させないという処理を加えて対処したらしい..
      • この話をmixiに書いたら、nohup かませばいいんとちゃうかと大学の先輩に言われた。それはまだ試してない...

*1:ご存知の通り、Linux/bin/shは/bin/bashシンボリックリンクです...

*2:ログインシェルに変えなくてもよい。おもむろに/bin/shと叩き実行中のシェルを変えるだけでおk

*3:所要時間30秒ほど:p

*4:同じく見るのに所要時間30秒ほど:p