qargs
開発::noddy
序
qargsはキューによってコマンドを反復実行するものである。
mmutilsにあるmmffrも似たような目的であるが、mmffrはffmpeg専用であるし、前提としてmmutilsが複数マシンでの分散を想定したものだが、qargsは実行時間に差があるコマンドを並列実行することを想定しており、特にダウンロード系の処理において利用するのに適している。
コード解説
コード自体は非常にシンプルで、エンキューコマンドとデキューコマンドの2つからなる。
エンキューコマンドはキューを生成するとともにUnixサーバーとなり、デキューコマンドの要求を待ち受けるデーモンとなる。 Unixソケットの接続があればキュー配列から1つshiftして返す、という構造だ。
一方デキューコマンドはUnixソケットに接続し、キューからアイテムを1つ受け取り、引数として与えられたコマンドにアイテムを引数として追加した上で実行する、ということを繰り返す。 この実行形式が適合しないものについては、ラッパースクリプトを必要とする。だが、そもそもの話としてラッパースクリプトのヘルパーみたいな存在なので、機能を追加するよりもこのほうが良いだろう。
キューが空になった場合、エンキューコマンド、デキューコマンドともに終了する。 (デキューコマンドは単純化のため、例外捕捉で抜けている。)
こういうものは既にありそうに思えるが、探してもみつからなかったので、作ってみた。
実践的な利用例
直列で実行する場合はこのようなことができるものとする。
for i in **/.download.zsh
do
(
cd ${i:h}
zsh .download.zsh
)
done
この内容をラッパースクリプトにする。
cd ${1:h}
zsh .download.zsh
tmuxで3並列で投げっぱなしにする。
tmux new-session "qargs.rb download dlhelper.zsh" \; split-window "qargs.rb download dlhelper.zsh" \; split-window "qargs.rb download dlhelper.zsh" \; detach-client
進捗を見たいときは
tmux a
そのまま閉じるか、デタッチしてしまえば続行される(走っているプロセスを終了してしまわないように注意)。 これで並列ダウンロードが捗るだろう。 (もちろん、相手側に負担のかかるようなダウンロードや、禁止されているダウンロードはしないこと。)