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 $_" );