概要
AtCoderや機械学習の前処理を行うようなスクリプトを組む場合,変数の状態をprintデバッグすることが多く,変更を加えて再実行して結果を確認する一連の作業がめんどくさいと感じていました.
そこで,ファイルの変更があった場合に事前に引数で渡したコマンドを実行してくれるコマンドラインツールmonitor
を作りました.
この手のCLIツールは探せばより優秀なものがすでにあるとは思いますが,とりあえず作ってみたことで愛着が沸きますし勉強になりました.
実装
https://github.com/maitaken/monitor
実装言語は使ってみたかったという理由でGo言語を選択しました.
インストール方法
GOの設定(GOPATHなど)がされているのであれば,以下のコマンドでインストールできます.GOのcontextを使用しているのでGoは1.7以上のバージョンが必要です.
git clone https://github.com/maitaken/monitor.git
cd monitor
make install
使い方
基本的な使い方は以下の2つです.
ファイルの監視対象が1つの場合,第一引数に監視するファイル名,第二引数に実行するシェルを指定します.
monitor [監視するファイル名] ["実行するシェル"]
ex)
monitor main.py "python main.py"
ファイルの監視対象が2つ以上の場合,-fオプションを使用します.このファイル名の指定にはワイルドカードが使用できます.
monitor -f [監視するファイル名] -f [監視するファイル名] ["実行するシェル"]
ex)
monitor -f main.py -f in "python main.py < in"
monitor -f "*.py" "python main.py"
TODO
いまのところでも結構使いやすいのですが,今後は以下の機能を付けていきたいと思っています.
指定したコマンドが終わるまで結果を出力してくれない
実行に時間がかかり,ある間隔で出力される値を確認したい場合,現状ですと全ての実行が終わるまで待たなければいけません.
そのため,途中経過を逐次出力する機能をつけたいと思っています.
ただ,もともとAtCoderで使うことを目的にしていたため,実行時間が長くても3sか4sくらいなので(それ以上長かったらTLEになってしまう)今のところ不便じゃないです.
ファイルをパッシブな方法で監視するように変更
現在の実装だと500msに一回ファイルの変更日時を確認して,一回前に確認した変更日時と異なっていたらコマンドを再実行するような実装になっています.(アクティブな方法)
アクティブな方法ではCPU使用率などのリソースが無駄に使われているので,OSのシステムコールを用いたファイル監視に変更していく必要があります.