cssh
私はDebian 10(パッケージ)を使用していますclusterssh 4.13.2-2
。
複数のサーバーに接続する場合:
cssh foo bar zz aa
csshは4つの端末を開き、アルファベット順に! これにより、次のように画面のウィンドウの順序を指定できます。
aa bar
foo zz
これは純粋な悪です!
ウィンドウを元の順序で維持するにはどうすればよいですか? Perlコードにいくつかのクイック修正がありますか?
ベストアンサー1
近似値を見ると源泉@servers
、与えられた順序で元のホスト名パラメータを保持するように見える配列と、ホスト名%servers
から派生したキーでインデックス付けされたすべてのホスト固有の情報を保持するハッシュ(ソートされていない辞書)があることがわかります。
存在するクライアントウィンドウを開く、順序付けられた名前の配列で呼び出されるように見え、ここで各%servers
項目を生成します。
では、retile_hosts()
与えられた順序でウィンドウが開き、$sort->( keys(%servers) )
コードは次から始まります。ここ、したがって表示される順序です。
したがって、考えられる解決策は、追加のフィールドで各サーバーエントリが生成された順序を維持し、キーの代わりにその値に基づいてソートされるように$sort
機能を変更することです。 (キーを変更する方が簡単ですが、よく使用され、不明な結果が生じる可能性があります。)
次のパッチは私のFedora 28バージョンで動作します。ClusterSSH.pm
展開バージョンに対してこの設定を変更する必要があるかもしれません。
--- usr/share/perl5/vendor_perl/App/ClusterSSH.pm.orig 2022-08-24 10:47:57.937143651 +0200
+++ usr/share/perl5/vendor_perl/App/ClusterSSH.pm 2022-08-24 11:32:43.637808164 +0200
@@ -116,9 +116,12 @@
my $host_menu_static_items; # number of items in the host menu that should
# not be touched by build_host_menu
my (@dead_hosts); # list of hosts whose sessions are now closed
-my $sort = sub { sort @_ }; # reference to our sort function which may later
+#my $sort = sub { sort @_ }; # reference to our sort function which may later
# be changed in run() if the user has asked for
# natural sorting
+# sort using original order of cli args
+# https://unix.stackexchange.com/a/714683/119298
+my $sort = sub { sort {$servers{$a}{order} <=> $servers{$b}{order}} @_ };
$keysymtocode{unknown_sym} = 0xFFFFFF; # put in a default "unknown" entry
$keysymtocode{EuroSign}
@@ -667,6 +670,8 @@
#$xdisplay->flush(); # dont flush here, but after all tiling worked out
}
+# sort using original order of cli args
+my $globalorder;
sub open_client_windows(@) {
my $self = shift;
foreach (@_) {
@@ -727,6 +732,8 @@
$servers{$server}{port} = $port || '';
$servers{$server}{master} = $self->config->{mstr} || '';
$servers{$server}{master} = $master if ($master);
+ # sort using original order of cli args
+ $servers{$server}{order} = ++$globalorder;
$self->debug( 2, "Working on server $server for $_" );