それマグで!

知識はカップより、マグでゆっくり頂きます。 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とかね

すぐわかるfindコマンドの使い方

find コマンドは ファイルとディレクトリを見つけるコマンド.ファイルを検索します.ファイルの検索はファイルのメタデータを調べます.つまりi-nodeに入ってる情報。つまりパス名,アクセス時刻,アクセス権です

find使い方。

一番最初にfind コマンドを使ってみる

cd /home/takuya 
find #ホームディレクトリのファイルを一覧する

find はカレントディレクトリの中身を列挙します.
Find初心者は,該当ディレクトリにCDしてから使うのがコツです.

find のオプション

find のオプションを知ってると捗る。そのままだと出力結果が多すぎて何も出来ない.そこでフィルタを書けて検索する

ディレクトリだけを一覧する
find -type d
空っぽディレクトリだけを一覧する
find -type d -empty
ファイルだけを一覧する
find -type f

php ファイルを一覧する

find -name '*.php'
css ファイルを一覧する
find -name '*.css'

大文字小文字を区別しない

  • -name の代わりに -iname を使う
find -iname september

日付条件

  • -daystartを付けると日付の深夜0時が日付基準なります
今日
find -daystart -mtime -1
一日前
find -daystart -mtime 1
二日前
find -daystart -mtime 2
7日以内
find -daystart -mtime -7
7日以上過ぎたもの
find -daystart -mtime +7

時間条件*1

数字(n) × 24 時間で考えます.数字は マイナス(-)が < で、プラス(+) が > です

72時間以上前全部
find -mtime +2
48時間前〜72時間未満
find -mtime 2
24時間前〜48時間未満
find -mtime 1
24時間以内
find -mtime -1
60分以内
find -mmin -60

ファイルの時間について

  • -atime … 最終アクセス時刻 (access time)
  • -mtime … 最終変更時刻 (modify time)
  • -ctime … 最終ステータス変更時刻 (change time)

パーミッション関連

所有者がtakuyaのファイルを一覧する
find -user takuya
パーミッションが777のヤバいファイルを一覧する
find -perm 777

階層でしばる

階層を3階層目までで止める

あまり深い階層までいくひつようもないとき

find -maxdepth 3

組み合わせて使います

所有者がTakuyaで最近1日で作ったphp ファイルを探す
find -user takuya -name '*.php' -daystart -mtime -1

見つかったファイルに処理をする

xargs と組み合わせて使います。xargsオススメです.-execよりわかりやすいです.*2

find -perm 777 | xargs -I@ sudo chmod 755 '@'

2017-08-02

ミススペルを 若干修正した。

*1:-mtime 1 を日付でなく時間と書いたのは,man に次のように書いてあるから 「ファイルが最後にアクセスされたのが n*24 時間前であれば真。」

*2:sudoとリダイレクトでチョッとクセあるけど