hack のためのネタ帳, etc,,,

bash 用の progress bar として apt-cyg に実験的に実装してたやつを分離してみた。

公式ページ等

memo

パーセンテージのインジケーターを付けたいなと思ったんだが、lesser-parallel なんかを使って並列処理させる場合にプロセス間で進捗を共有する上手い方法が見つからず困った。
ファイルに進捗を書き込む場合、値を読んで加算して再度書き込んでと、アトミックにやる必要があるし、並列にやるとどうしても I/O が足を引っ張る。
そこで、 等々、いろいろやってみたんだがやっぱり 1000 分割超えると地味に遅い。
何か良い方法はない物か?

2018-11-29:
bash ネイティブの TCP, UPD socket も試してみたが、
nc -l 65432
echo 1 >/dev/tcp/localhost/65432
nc -u -l 65432
echo 1 >/dev/udp/localhost/65432
のような感じで、まず listen に nc が必要そうで、
/dev/tcp は open のコストが高いのか、echo して終わるまでに一呼吸くらいかかるのと、
/dev/udp はなぜか nc に反応がないのとで、
どうも望み薄。
UNIX-domain socket は、bash ネイティブに扱う手段が見つからず微妙(多分 nc か socat を使うしかない)。
で、たどり着いたのが file descriptor 3 に適当なファイルをぶら下げておいて、stat -c %s するって方法。
具体的には、
exec 3<>/tmp/hoge.$$
echo -n . >&3
stat -c %s /tmp/hoge.$$
exec 3>&-
exec 3<&-
みたいな感じ。
これは爆速で、1万回くらい回してもオーバーヘッドが気にならない上、
子プロセスでも親の /dev/fd/3 継承してて、echo >&3 は追記動作となるので、
lesser-parallel 使ってマルチプロセスしても問題なく動く。
という事で、実装結果: dev-percent-with-fd

途中で ^C で止めると、percentage indicator のプロセスが defunc して残るという致命的な問題があるので、これどうにかしないとだけど、と思ったら、対処方法は意外と簡単で、/proc/$$ の有無を確認するだけで良かった。
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます