Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clicube/a39cdd7bb3c9f53588bf to your computer and use it in GitHub Desktop.
Save clicube/a39cdd7bb3c9f53588bf to your computer and use it in GitHub Desktop.

[Ruby] 動作中のRubyプロセスにコマンドを送れるgemを作りました

ずっと動いているタイプの(デーモンみたいな)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

とだけ打てば、シェル風の入力インターフェイスになります。

せっかくなのでgemにしました

https://github.com/clicube/command_server

$ gem install command_server
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment