我是perl的新手,我的情景是有一系列主机, 在循环中,我正在创建DNS并连接到数据库。 但是,如果任何主机没有响应或关闭,那么该循环正在中断 并且剩下的主机无法连接,我的问题是如何跳过它 意味着如果任何主机无法连接,那么我想跳过该主机,并希望与其他主机连接... 大家好 , 我是perl的新手,我的情况是有一系列主机。
在循环中,我正在创建DNS并连接到数据库。 但是,如果任何主机没有响应或关闭,那么该循环正在中断
我的问题是如何跳过这个问题 意味着如果任何主机无法连接,那么我想跳过该主机并希望与其他主机连接......或者尝试再次重新连接该主机...
下面给出了一段代码
@arr_ =('host1','host2');
foreach $host (@arr_){
@Mydsn =("dbi:mysql:$MYSQL_DATABASE:$host:$MYSQL_PORT","$MYSQL_USER","$MYSQL_PWD");
my $my_connection = DBI->connect(@Mydsn, { RaiseError => 0, PrintError => 1 } ) or die("Fail to connect Database connection");
### Here how can i skip if mysql is not able to connect with breaking execution of script
}
请帮帮我! 提前致谢 请帮帮我! 提前致谢
答案 0 :(得分:2)
die
立即停止脚本。请改用next
。调整上面的代码:
my @arr = ('host1','host2');
foreach my $host (@arr){
my @mydsn = ("dbi:mysql:$MYSQL_DATABASE:$host:$MYSQL_PORT","$MYSQL_USER","$MYSQL_PWD");
my $my_con = DBI->connect(@Mydsn, { RaiseError => 0, PrintError => 1 } );
if ( ! $my_con ) {
warn "failed to connect to $host";
next;
}
}
在这种简单的情况下,next
当然是不必要的。
答案 1 :(得分:0)
也许您可以先检查服务器是否处于活动状态,类似于:
use IO::Socket::INET;
@arr_ =('host1','host2');
foreach $host (@arr_) {
$sk = IO::Socket::INET->new(PeerAddr => $host,
PeerPort => '5432', # if postgres
Proto => 'tcp' );
if ($sk) {
my $my_connection = DBI->connect(@Mydsn, { RaiseError => 0, PrintError => 1 } )
or die("Fail to connect Database connection");
}
}