CygwinでCVSしたいなぁ
したいならすればいいじゃん、というわけで
S.S.S. - Tech - CygwinでCVSサーバを立てる
こちらを参考にやってみたが、
したせいか、いろいろと変な目に遭ったのでメモ。
xinetdをrestartしちゃうと……
cvspserverのラッパー作成まで済ませて、機嫌よく
$ /etc/rc.d/init.d/xinetd restart
とやってcvsにログインしようとするとはねつけられる。
なにゆえ〜、とps -efしてみると、xinetdがSYSTEMでなく作業ユーザで動いていた。(そりゃまぁそうだ) そして(Windowsの)イベントビューアを見るとsetuidがPermission deniedで失敗した、とある。
Windowsはこのへんシビアで、かなり特殊な権限を持ったユーザーでない限り、現在のプロセスを別のユーザのコンテキストに切り替える(setuidってつまりそういうこと……ですよね? )ことはできないようになっている。(詳細は「cygwin setuid」あたりで検索)この権限はデフォルトではAdministratorにすら与えられておらず、SYSTEMのみが可能になっている。
ということで、別プロセスを適切なユーザ権限で起動するという仕事をしてもらうためには、xinetdには何とかSYSTEMで動いていただかないと困るわけです。
乏しい知識でchmod +sしてみるとかやってみたが沈没。結局、xinetdを再起動したければサービス化してある(のでSYSTEMで動いている)initを再起動するのがよい、ということらしい。(本物のUN*Xだとものすごい話だ)
ぢゃあxinetdをサービスにすればいいのでわ
と思ったがそうはイカの眼(まなぐ)。Cygwin上のプログラムをサービスとして動かしたい場合cygrunsrvを使うのが定石だ(と思う)が、これでxinetdをサービスとしてインストールすると、
という奇怪な事態になる。でもこれも奇怪でも何でもない話で、cygrunsrv.READMEに
There's currently one caveat, though. If the application behaves as a "normal" unix daemon and exits after forking a child, cygrunsrv will immediately stop the service (but the actual daemon keeps running in the background). This means that you cannot then STOP the daemon using cygrunsrv, but you must explicit kill it via 'kill -9 <daemon_pid>'
とある。どうやらxinetdはこれに該当するらしい(ソース読んだわけではないのではっきりしたことは言えませんごめんなさい)。sshdやsquidはforkしないオプション付きで設定すればOK、ともあるがxinetdにはそれらしいオプションがない。ということで、xinetdを単独でサービス化するのは難しいぽい(cygrunsrv以外のサービス化ツールを使えば可能かもしれないが、試せてません)。
まだ何か?
その他細かい話。