ずっと動いているタイプの(デーモンみたいな)Rubyプログラム、 現状の状態をうかがい知るためにはログを丁寧に出力させなければいけなくて、 かといって細かいログまで出力させると必要性の低いものもどんどん出てきてしまう。
show_status みたいなコマンドを打って、状態をぱっと出力できたら便利だなあと思ったので作ってみました。
動作中のプロセスに対して「あれしろ、こうしろ」って後から指令を送る用途にも使えそうです。 「一時停止しろ」とか「接続しろ」とか「終了しろ」とか。 設定ファイルやら起動時のコマンドパラメータ以外でプログラムを制御するのも楽しいものです。
require 'command_server'
class SomeWorkClass
def initialize
@cmdserver = CommandServer.new
@cmdserver.enable_builtin_command("eval");
@cmdserver.enable_builtin_command("help");
@cmdserver.register_command("add_worker", method(:add_worker))
@cmdserver.start("/tmp/some_work_sock")
end
def add_worker arg
Thread.new do
loop do
puts Thread.current
sleep 1
end
end
end
end
SomeWorkClass.new
sleep
として、このスクリプトを走らせておきます。 add_workerは、ただひたすら1秒ごとに文字列を出力するスレッドを追加するメソッドです。 そのあと、
$ cmdshell /tmp/some_work_sock add_worker
を実行するたびに、新しいスレッドがどんどん増えていきます。
また、ここで
$ cmdshell /tmp/some_work_sock eval puts Thread.list.length
などと打てば、実行中のスレッドの数なんかも見えてしまいます。 evalで中身を覗くの、デバッグにも使えそうな気がします。
$ cmdshell /tmp/some_work_sock eval
とだけ打てば、シェル風の入力インターフェイスになります。
https://github.com/clicube/command_server
$ gem install command_server