bash - perl通过ssh运行远程bash命令

  显示原文与译文双语对照的内容
138 5

我在远程服务器上计划使用下面的脚本来执行bash命令。每次该脚本运行时,都应该检查远程 MySQL ( PXC ) 服务器是否正在运行 SST 。

#!/usr/bin/perl
use strict;
use warnings;
my $time = localtime();
my $file = '/db-common-list/names.txt';
open my $info, $file or die"Could not open $file: $!";
while ( my $hostname = <$info> ) {
 my $wsrep_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`;
 if ( index($wsrep_check, 'State transfer in progress, setting sleep higher mysqld')!= -1 ) {
 print"$time: Server $hostname";
 last if $. == 2;
 }
}
close $info;

/db-common-list/names.txt 里面是一个数据库的列表,脚本应该逐行循环。所以它看起来像这样:

db-test-1
db-test-2
db-test-3
db-test-4
...

但是当我运行脚本时,命令行 挂起,从不显示任何东西,此时我不得不手动强制脚本停止执行。所以几分钟之后,只有脚本挂在终端上,我用 ctrl d 停止脚本,我得到了这个:

thegeorgia@cron-db$./test.cron
Connection to db-test-1 closed.
Connection to db-test-2 closed.
thegeorgia@cron-db$./test.cron

我可以以使用ssh和ping这些远程服务器,以便在服务器下面演示,这不是一个确定的问题:

thegeorgis@cron-db$ ping db-test-1
PING db-test-1 (10.1.4.205) 56(84) bytes of data.
64 bytes from db-test-1 (10.1.4.205): icmp_seq=1 ttl=64 time=0.263 ms
64 bytes from db-test-1 (10.1.4.205): icmp_seq=2 ttl=64 time=0.222 ms 

所有涉及的服务器正在运行 Ubuntu 。

注:就像Borodin建议的那样,我添加了 chomp,如下所示:

 while( my $hostname = <$info>) {
 my $server = chomp( $hostname );
 my $wsrep_check = `ssh $server ls`;
 if ( index($wsrep_check, 'State transfer in progress, setting sleep higher mysqld')!= -1 ){
 print"$time: Server $server";
 }
last if $. == 2;
}

运行perl脚本时,我现在得到以下错误:

ssh: connect to host 1 port 22: Invalid argument
ssh: connect to host 1 port 22: Invalid argument

解决方法:

#!/usr/bin/perl -w
use strict;
use warnings;
my $time = localtime();
my $file = '/db-common-list/names.txt';
open my $info, $file or die"Could not open $file: $!";
while( my $hostname = <$info>) {
 chomp( $hostname );
 my $wsrep_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`;
 if ( $wsrep_check ne"" ){
 print"$time: Server $hostnamen";
 }
}
close $info;
时间:原作者:0个回答

78 1

你需要

chomp $hostname;

在你的ssh命令从读取中删除尾随换行之前

我也怀疑你last if $. == 2应该在 if 块之外的地方被删除

Perl支持 正规表达式,因此很少需要对 index 进行调用

if ( index($wsrep_check, 'State transfer in progress, setting sleep higher mysqld')!= -1 ) {.. . }

通常会被写下来

if ( $wsrep_check =~/State transfer in progress, setting sleep higher mysqld/) {.. . }

但你写的是很好

原作者:
...