auto_restart - Earthquakeをメモリ解放のために一定時間で再起動するプラグインを書いた

あの日見たソフトウェアの能力を僕はまだ知らない。(名前は知ってた)

皆さん、Twitterクライアントは何をお使いでしょうか?私は最近Earthquakeというターミナルで動くクライアントを使い始めたところです。いや、数年前からあったんですけど、あの大地震の記憶も冷めやらぬときにツイートが回ってたもんですから、てっきりTwitterで地震速報を受け取れるソフトだと勘違いしてました。

Earthquakeの良いところ

使い始めた感想ですが、今までのTwitterクライアントで通常時のメモリ使用量が格段に少ない(38MB!弊社調べ)とこが気に入りました。

そして、このソフトウェア、Rubyで書かれているのですが、言語内DSLが素晴らしいです。壮絶技巧な黒魔術もなく平易に書かれているので、Rubyの入門用ソースコードリーディングにも最適です(全部は読んでないですが、多分)。綺麗。

また、プラグインが特定ディレクトリにファイルを1個置くだけって手軽使用なんで、入門用ソースコードライティングにもオススメです。公開もgistにアップロードするだけ。ステキ!抱いて!

んで、僕もプログラミングのリハビリにプラグインを書いてみました。auto_restartって名前のメモリ解放のための自動再起動プラグインでっす。

Rubyのソフトウェアは常時起動してるとメモリがぶくぶく太って行き再起動が必要なことがあります。ツラい。デーモン管理ツールのBluepillなんかを使うのも良いですが、ちょっと導入が面倒ですよね。なのでプラグイン化してみました。

インストール

Earthquake内コマンド一発です。

⚡ :plugin_install https://gist.github.com/babie/7069234

頭の稲妻マークは除けてコピペしてくださいね。んで :restart すればプラグインが読み込まれます。

設定

デフォルトで1時間間隔となってますが、お好みで変更できます。例えば2時間にするには、

Earthquake.config[:auto_restart] = { :interval => 2.hours }

こんな感じです。秒数なので注意してくださいね。EarthquakeはActiveSupportを読み込んでいるので2.minutesとか書けます。もちろん60 * 60 * 2なども可です。

使い方

名前の通り自動です。というか手動リスタートは標準コマンドに:restartってのがありんす。

コード

こんな感じです。

gist7069234

タイマーしかけて時間が来たら標準コマンドのEarthquake::Input#input(":restart")を呼ぶってすげぇ簡素なコードなんですが、めちゃめちゃハマりました。何回か再起動してると入力しても文字が表示されないことがあるんです。
Readline.readline が動いているスレッドを避けてリスタートしたり特に念入りに殺してリスタートしたりしてみたけどよくわからない。ググってググってようやく辿り着いたのがstty echoです。なんかReadlineの動いてるスレッドをkillするときstty -echo(入力をターミナルで反響しない)しちゃう時があるみたいです。
うーむ、terminfoとかターミナルに特有なUnixの知識を避け続けたのが仇になったようです。読めない略語が多くてつらいんだもん。まぁ、時間はかかったがなんとか成って良し。

今後の拡張予定

あれだ、RSS(実メモリ)はリセットされるんだけど、VSZ(仮想メモリ)の減らし方は知らん。まー、実際に専有してなきゃええんじゃないか?

次回予告

明日はまたEarthquakeプラグインを紹介します。

Earthquakeプラグイン書くの楽しい!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

追記

なんか次回の関係でソースコード読んでたら、ActiveSupport::Cache::MemoryStore 使ってるので、設定ファイルでconfig[:cache] = ActiveSupport::Cache::MemoryStore.new(:size => 16.megabytes)とかするとキャッシュサイズ制限できるっぽい。けど、元々デフォルトで32MBになっていて充分少ないし、時間が経つとメモリ食っていくのも変わらないので、上のプラグインが不要ってわけでもないですわん。