dodaの日記: ブロードキャストコマンドの対象ウィンドウ数 7
ブロードキャストコマンドで 51 枚目以降のウィンドウに送信が出来ないという話が出た。
これはウィンドウを管理しているリスト(配列)のサイズが 50 になっているから。
51 個目以降のウィンドウはこのリストに登録されない。
ブロードキャストはこのリストを利用する為、このリストに登録されていないウィンドウには送信できない。
このリストはブロードキャストコマンドの他にも、「ウィンドウ」-「ウィンドウ」で出てくる「ウィンドウのリスト」ダイアログや
Ctrl-TAB でのウィンドウ切り替えでも利用していて(元々はこっちの為にあったリスト)、登録されないウィンドウはこれらでも対象外になる。
要望では対象となるウィンドウ数を設定で変更できるようして欲しいという事だったが、ウィンドウリストは共有メモリ上にあり
すべてのTera Termウィンドウで共有されているので、設定で動的にサイズを変えられるようにするのは面倒そうだった。
# 可変長にすればいいんだろうけれど、関連しそうな所を調べるのが面倒で…結局は手抜きか
という事でリストのサイズ変更じゃ駄目?と訊いた所、OK との返事が。
それじゃどれくらい必要かという質問には、
当方といたしましては現状約200枚の同時起動のパターンがありましたので 想定している最大値としては256枚を考えております。
という返事が。
同時に 200 枚とは中々の強者。
# というか、ちゃんと動くんだと思ったり(^^;
方針が決まったので、要望に従ってウィンドウリストのサイズを 256 へ変更。これ自体は簡単。
問題なのは動作確認。
一枚ずつウィンドウを開くのは面倒なので、必要な枚数のウィンドウを開いた後に exit をブロードキャストする、以下のようなマクロを作った。
MaxWin = 210
constr = "ssh://sue@nagato /auth=pageant /W=%03d /X=%d /Y=%d /SIZE=80x24"
prompt = "sue@nagato"
mcastname = "test"
xn = 10
xd = 120
yd = 40
yb = (MaxWin-1) / xn * yd
for i 1 MaxWin
sprintf constr i (i-1) % xn * xd yb - (i-1) / xn * yd
connect inputstr
wait prompt
sendln "unset HISTFILE"
setmulticastname mcastname
if i <> MaxWin unlink
next
pause 5
sendmulticast mcastname "sleep 5; exit"#13
まずは元々の問題の確認という事で、4.67 リリース版で 55 枚のウィンドを開いてみようとした。
すると、20 枚目位から動作が非常に遅くなってきた。
どうやら、半透明で使っている事が原因のようで、半透明のウィンドウが何枚も重なっている状態の描画が重いようだ。
結局 30 枚程度で耐えられずにマクロを停止。半透明を無効にして再度試す事にする。
既に開いている 30 枚のウィンドウを閉じようとして、ブロードキャストコマンドで exit を送る。
すると zsh が一斉に .zshhistory へヒストリを書き込もうとし、結果 .zshhistory が壊れた。orz
ヒストリを失ったのは少し悲しかったけれど、同じ轍を踏まないように、ログイン直後に unset HISTFILE するようにマクロを書き換えた。
気を取り直して、半透明を無効にしてから再度テスト。
予定通り 51 ~ 55 番のウィンドウを残してウィンドウが閉じた。
次に修正版の動作を確認する為に 55 枚のウィンドウを開いた。
これも予定通り全ウィンドウが閉じた。
念のため 200 枚オーバーを試そうと MaxWin を 210 に設定してテスト。
しかしなぜか 80 枚目辺りのウィンドウでログインが進まなくなった。
ログインが進まなくなったウィンドウをよく見ると、メニューバーが出ていない。
おそらくデスクトップヒープが足りなくなったんだろうと判断し、レジストリをいじって 8MB に増やした。
OS を再起動後、再度 210 枚で試すと無事に 210 枚開けた。
が、間違えて 4.67 リリース版を起動していた。
当然 50 枚しか閉じず、泣きそうになりながら残った 160 枚のウィンドウを必死に閉じてまわった。
全ウィンドウを閉じた後、修正版で再度 210 枚のテスト。今度は無事に開けた。 [開いた状態]
しかし、その後に exit をブロードキャストした時になぜか 80 枚程度のウィンドウにコマンドが送られなかった。
最初、ブロードキャストしている間にブロードキャスト元のウィンドウが閉じてしまったためかと思ったが、
よく見るとブロードキャスト元のウィンドウにも送りそこなっているのでこれは違う。
色々考えた結果、ブロードキャストしている間に前半のウィンドウが閉じたため、ウィンドウリストがリナンバリングされた事が原因だと結論づけた。
うーん。これって対応した方がいいのかなあ。後で考えよう。
とりあえずは送るコマンドを "sleep 5; exit" にして閉じるタイミングを遅らせたところ全部閉じるようになった。
残件は exit を送った時に送れないウィンドウが出る事への対応か。
とりあえずはチケットに登録しておいた。
160枚を手で… (スコア:2)
taskkill [tech-recipes.com]とか、"プロセス ツリーの終了"ではだめだったんでしょうか…
Re:160枚を手で… (スコア:1)
仕事柄とか考えるとTeraTermマクロからってのは必要になりそうだけど...
でもなにかコマンド実行でやれそうではありますね
M-FalconSky (暑いか寒い)
「正常に閉じたい」という場合ではないと思うので (スコア:2)
「他のツール使えば操作できるんだからnot a bugだろ」とかいうわけではなくて、たくさんのプロセスを一度にkillしたい状況ってWindowsでもありますよね。
# Chromeが応答しない時とか。メインの一個を閉じれば他全ても閉じるけど、探し出すのが…
Re:「正常に閉じたい」という場合ではないと思うので (スコア:1)
プロセスをKillするかはともかく、ウィンドウに対してだったらWM_CLOSEメッセージおくりつければ閉じるとも言えるので、なんかしらツールはありそう。
killなら、PowerShellからスクリプトでkillするのがたぶん最適でしょうねー。
M-FalconSky (暑いか寒い)
Re:160枚を手で… (スコア:1)
ブロードキャストコマンドの対象外になっているだけで、ソフトとしては正常に動作しているから
できれば正常に終了させたかったのです。
どうせやる事は Control-D を 160 回押すだけでしたし。
あと、Tera Termのウィンドウを開いていったマクロは先に終了しているので、
"プロセスツリーの終了"は使えなかったというのも有ります。
SOS団(長門有希)と戦えるようになった! (スコア:1)
長門は俺の船 (スコア:1)
由来はそっちじゃないんです。
新しくサーバを2台入れた時に yamato と musashi と名前を付けたら「沈みそう」と言われて、
それじゃという事で、横須賀生まれという事もあって片方を現存する mikasa に変更。
もう片方はどうしようかと思いましたが、とりあえず終戦まで残っていたという事で決めました。
# まあ、まったく意識しなかったと言ったら嘘になりますが
## でもやっぱり眼鏡があった方がいいと思う