2013年07月

ruby の god (神) と戯れたメモ

今作っている rails アプリのプロセス管理を god (github) にしてもらいたいと思って神と戯れた。

god を利用することで unicorn プロセスも woker (serverengine を使用) プロセスもまとめて起動したり、まとめて閉じたりできる(はず)。今回はそれに加えて、god にログローテーションを任せたい(daemontools の multilog のように)と思って奮闘したメモ。

戦略

  1. god の Logger にログローテーション機能を追加. @todo: God::SimpleLogger を ruby の標準 Logger で再実装して shift_age オプションなどを使えばできそう
  2. w.log を使用すると起動するプロセスの STDOUT をキャプチャーして god の Logger がログファイルに書き込んでくれるようなので使う
  3. そのために unicorn および serverengine が STDOUT にログを吐くようにする
    1. (unicorn) 設定ファイルの stderr_path および stdout_path に何も指定せずにフォアグラウンドで動かすと STDOUT に出る。バックグラウンドで起動すると /dev/null に捨てられる
    2. (serverengine) オプションの :log に '-' を指定すると STDOUT に出せる。こちらもやはりバックグラウンドで動かすと /dev/null に捨てられる。
  4. god が kill でシグナルを送れるように unicorn および serverengine の pid をファイルに保存する
    1. (unicron) 設定ファイルの pid で指定できる. フォアグラウンドでもバックグラウンドでも出せる
    2. (serverengine) オプションの :pid_path で指定できる. バックグラウンドでないと出力されない。@todo: フォアグラウンドでも出力できるようにいじる(いじった)
結果

上の戦略でイケるかと思ったが、結論としてはダメだった。god はどうやら、管理するプロセスをフォアグラウンドで起動させた場合には w.stop および w.restart が使えないらしく、w.stop, w.restart を使って上記 4. で保存した pid に kill コマンドでシグナルを送ろうと思っていたのに、それができなかった。

以下、未来の自分のためにメモを残しておく。god の癖メモ

  1. w.start でプロセスをデーモン起動させないと w.stop および w.restart が使えない
  2. フォアグラウンドじゃないと w.log 使えない
  3. フォアグラウンドで起動したプロセスにはデフォルトでは TERM を送る。変えたいときは w.stop_signal = 'QUIT' で変えられるが、w.restart_signal はないので リスタートシグナルを変えられない
  4. w.start = "cd /full/path/to && ruby hoge.rb" のようにした場合、stop シグナルがこれを起動する sh プロセスに送られてしまい、ruby プロセスにシグナルが送られない. w.start = "ruby /full/path/to/hoge.rb" なら OK
  5. god start -D でフォアグラウンド起動して、他の端末から god stop [task] とか送ると(多少)捗る
  6. god stop [task] した場合に w.stop が発動していれば何かしら god のログに出る。なにも出ない場合は、今回のように何も処理していないと判断してよい。
  7. god 自体のログは -l オプションでパスを指定すると syslog からファイル出力に切り替えられるが、logrotate の機能などはない

 

Rails Tutorial 翻訳のお手伝いをしました

こんにちは @sonots です。

Rails Tutorial の翻訳が無事公開されましたので、お知らせします! → http://railstutorial.jp/
Rails 

Rails Tutorial というのはご存知の方もいらっしゃるかもしれませんが、 Michael Hartl さんという方が公開しているその名の通り Rails のチュートリアルサイトです。先日の Ruby Hiroba で @yasulab さんが翻訳作業の協力者を募集していて、私も第10章だけですが、お手伝いしました。

今回は Rails 3.2 系のチュートリアルの翻訳になっているのですが、近々 Michael さんの手により Rails 4系のチュートリアルも出るとのことのなので、その際には今回の翻訳で使い回せる所は使い回しつつ、加筆修正していく感じになるのだろうと思います。

それでは Rails Tutorial をよろしくおねがいいたします。続きを読む

MacにElixirを入れただけのメモ

http://elixir-lang.org/getting_started/1.html を参照 
まずは erlang-r16 が必要なのでそれを入れる
$ brew tap homebrew/versions # untap で戻すらしい
$ brew install erlang-r16
######################################################################## 100.0%
==> Compilation takes a long time; use `brew install -v erlang` to see progress
==> ./otp_build autoconf
==> ./configure --prefix=/usr/local/Cellar/erlang-r16/R16B --enable-kernel-poll --enable-threads --enable-dynamic-ssl-lib --enable-shared-zlib --enable-smp-support --with-dynamic-trace=dtrace --enable-hipe --enable-darwin-64bit
==> make
==> make install
######################################################################## 100.0%
######################################################################## 100.0%
Warning: Could not link erlang-r16. Unlinking...
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link erlang-r16'
なんかエラー出た。言ってる通り brew link を打ってみる。
$ brew link erlang-r16
Linking /usr/local/Cellar/erlang-r16/R16B... Warning: Could not link erlang-r16. Unlinking...

Error: Could not symlink file: /usr/local/Cellar/erlang-r16/R16B/bin/typer
Target /usr/local/bin/typer already exists. You may need to delete it.
To force the link and delete this file, do:
  brew link --overwrite formula_name

To list all files that would be deleted:
  brew link --overwrite --dry-run formula_name
今度は --overwrite しろと言われたのでそのとおりやってみる
$ brew link --overwrite erlang-r16
Linking /usr/local/Cellar/erlang-r16/R16B... 5417 symlinks created
入ったっぽい。

elixir を入れる
$ brew install elixir
==> Downloading https://github.com/elixir-lang/elixir/tarball/v0.7.1
Already downloaded: /Library/Caches/Homebrew/elixir-0.7.1.tgz
==> make
==> elixir (compile)
ERROR: OTP release R16B01 does not match required regex R15
make: *** [erlang] Error 1

アレ。0.9.3 最新らしいのにすごい古いな。update
$ brew update
$ brew info elixir
elixir: stable 0.9.3, HEAD
Not installed
From: https://github.com/mxcl/homebrew/commits/master/Library/Formula/elixir.rb
よし、0.9.3 が出て来たのでもう1回
$ brew install elixir
=> Downloading https://github.com/elixir-lang/elixir/archive/v0.9.3.tar.gz
######################################################################## 100.0%
==> make
ἷA  /usr/local/Cellar/elixir/0.9.3: 273 files, 3.2M, built in 89 seconds

interactive elixir shell を起動して確認
$ iex
iex(1)> 1 + 1
2



A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー