gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:13:41 25 4
gpt4 key购买 nike

我计划使用以下脚本在远程服务器上执行 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。

笔记:
正如鲍罗丁所建议的,我添加了如下内容:

    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 $hostname\n";
}
}
close $info;

最佳答案

你需要

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/ ) { ... }

但是你写的很好

关于bash - 通过 ssh 运行远程 bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46110013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com