GNU screen を簡単に外側から操作できるようにする Ruby ライブラリ easy-screen

screen をよく使っているんだけど、起動したあとの vi を開いたり、必要なログを tail したり、あらかじめ余分に bash をいくつか開いておいたり、といった動作を自動化できたら便利だろうなと前から思っていた。
(detach しておけばいいんだろうけど OS を再起動すると消えてしまうので、もっと確実な手段が欲しかった)

via nbqx さんのこの辺を見ていたらそんなようなことができそうだったので色々試していたんだけど、なんかライブラリみたいのができたので公開してみる。

こんなのを書くと、

require 'rubygems'
require 'screen'

Screen('admin') {
    window('vi')   { exec 'vi' }
    window('top')  { exec 'top' }
    window('tail') { exec 'tail -f /var/log/apache2/error_log' }
}

こんな感じで「screen 起動 + 3 つのウィンドウを開く + それぞれのウィンドウでコマンド実行」が行われる。

http://gyazo.com/88d2bf51e72307c33a7b189faf65ebaf.png

あと Screen::Window#ssh というメソッドも用意されていて、「6 つのウェブサーバにログインして Apache のログを tail する」みたいなことも簡単にできる。*1

Screen('log_tail') {
    username, password = 'some_username', 'some_password'
    servers = ['web01', 'web02', 'web03', 'app01', 'app02', 'app03']
    servers.each {|s|
        window(s) {
            ssh s, username, password
            exec 'tail -f /var/apache2/log/error_log'
        }
    } 
}

window() のブロック ({}) の中では exec 以外でも split とか log とか screen のコマンドならなんでも使える…はず (まだちゃんと試してない…)。動かないところあったら教えてもらえると助かります。

'gem install screen' 'gem install easy-screen' でインストールできます。あと、 RubyScreen とか Screeninator とか似たようなの見つけたんだけど、いずれも設定ファイルで細かく指定するタイプだったので、このライブラリのメリットは DSL っぽく書けるところということで…。

メタプログラミング Ruby」とか「Ruby Best Practice」とか読んだおかげでだいぶすっきりした Ruby のコードを書けるようになった気がする。なんかもっと色々作りたいな。

*1:例が良くなくてこの場合は複数サーバのログをマージして tail できるという点で capistrano のほうが良さげですが、要は他のサーバに ssh とかもスクリプティングできるよという話です。