それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

スクリプトをDaemonizeする。god ツール.しかもプロセス監視・再起動付き

twitter ボットとか、ファイル同期ボットとか、メール転送ボットとかイロイロボット作るよね?ボッと作らないで、プログラムを使う意味がないというか,ボットがあるからこそプログラムに価値があるわけです.

rubyのプロセス管理ツールGod がそこそこイカス

プロセス監視・再起動するのが面倒なので,ツールを探してるとGODを見つけた
Gravatarの開発者が作って使ってるらしい.

多機能なので基本的なところから

god インストール

gem install god

god を使ってプロセス管理

test.god

God.pid_file_directory = "/tmp/god_pids/" #god が書き込みできるディレクトリ
God.watch do |w|
     w.name = "myscript"
     w.start = "/home/takuya/test/myscript.rb"
     w.start_if do | start
          start.condition(:process_runnning) do | c |
               c.interval = 60.seconds
               c.running  = false
          end
     end
end

myscript.rb という適当に、なかなか終わらないファイル。を起動してみる

起動

sudo god -c test.god

ウマく起動しないときは

sudo god -c test.god -D

" -D "を使うこと. -D は、エラーメッセージをコンソールに出してくれるし、バックグラウンドに移行しないので便利です.

god の監視状況を制御する.

#設定再読込
sudo god load myscript
#プロセスを止める
sudo god stop myscript
#god 全体を終了
sudo god terminate

mysqcript はw.name="myscript"で決めた名前。

コレでできあがり

意外と簡単に常駐できて便利です.

ずっと実行しておきたいコマンドに便利です.

rsyncとかいいですね.Cronだと複数個走っちゃう恐れがあるもんね.

God で出来ること

  • GodはRubyで書かれたプロセス管理ツール
  • Godは設定もRubyで書くことが出来る
  • God.watchのブロックに設定を書く
  • コマンドは何でもいい
  • 数分に一度,プロセスが生きてるか確認する.
  • プロセスの再起動条件を書くことが出来る
    • メモリ使用量が一定値を超えたら再起動する.
    • CPUを占有したら再起動する
    • 閾値を決めることが出来る.
  • 通知機能がある
    • twitter
    • jabber
    • webhook
    • prowel
    • メール
      • smtpサーバー指定可能
      • from/to も指定可能
      • tls も出来る
  • ユーザーIDは変更可能
  • ワーキング・ディレクトリも変更可能.
  • ログは標準出力に

おおい・・・

再起動コマンドの指定

God.watch do |w|
      ...
      w.restart = "/home/takuya/myscrpt restart"
    ...
end

終了コマンドの指定

God.watch do |w|
      ...
      w.stop = "/home/takuya/myscrpt stop"
    ...
end

プロセスをDaemonizeしたときには特には要らないんですけどね。

CPU占有率が一定を超えたら再起動

God.watch do |w|
      ...
      w.restart_if do |restart|
        ...
        restart.condition(:cpu_usage) do |c|
          c.interval = 10.seconds
          c.above = 20.percent
          c.times = 5
      end
    end
    ...
end

10秒ごとの測定で,CPU占有率が20%を5回超えたら,再起動する.(再起動コマンド指定すること)

メモリの使用量が一定量を超えたら再起動

w.tansition(:up, :restart).do| on |
     on.condition(:memory_usage) do |c|
          c.interval = 20.seconds
          c.above = 50.megabytes
          c.times = [3, 5]
end

20秒に一回,メモリが使用量50メガをチェックし、5回で3回超えていたら、再起動する.


ログを見たい

ログ機能は、実行スクリプトの、標準出力をログとして取得することが出来る.

God.watch do |w|
...
    w.log = "/home/takuya/test.log"
...
end

ユーザーIDを変えたい

God.watch do |w|
...
    w.uid = "takuya"
    w.gid = "takuya"
...
end

ワーキング・ディレクトリを指定したい

God.watch do |w|
...
    w.dir = "/home/takuya/test/tmp/dir"
...
end

通知をGmail経由で

これめんどくさいけど,コピペで行くっぽい
Godでプロセスが落ちたときにgmailで通知する方法 - harry’s memorandum

Chrootさせる

マニュアルには書いてあるけど,メリットが分らない.

  God.watch do |w|
    ...
    
    w.chroot = '/var/myroot'
    
    ...
  end

GODの各種機能

開発元ドキュメントを見ると、機能多いので大変,

Grouping Watches              
Redirecting STDOUT and STDERR of your Process
Changing UID/GID for processes
Setting the Working Directory
Setting environment variables
Using chroot to Change the File System Root
Lambda commands
Customizing the Default Stop Lambda
Watching Non-Daemon Processes
Loading Other Config Files
Dynamically Loading Config Files Into an Already Running God
Getting Logs for a Single Watch
Notifications
Available Notification Types
Email
Jabber
Prowl
Scout
Twitter
Webhook
Extend God with your own Conditions

Bot作ったあとに起動し続けるのがめんどくさい。

botが落ちたり,なんか、止まったり.そんなことがめんどくさいのです.

Screenで起動しっぱなしでも良いよね、

screenを使って起動しっぱなしが一番楽なんですよね.
あとnohupとかね