Script.pl
此脚本在netwrok接口上使用netem进行数据包丢弃。 此脚本使用配置文件和serverlist.cfg文件,并在serverlist.cfg中提到的所有服务器上运行。 它需要一台服务器并运行该服务器上的所有命令。 但是我面临的问题是睡眠不适用于上述脚本。
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw( shuffle );
use Net::SSH::Perl;
use lib qw("/usr/share/Net-SSH-Perl-1.42/Net-SSH-Perl-1.42/lib/Net/SSH/");
require "configuration.pl";
my $filename = 'serverlist.cfg';
my $line_count = 0;
my $hostname;
my $username;
my $password;
my @lines;
open(my $data, '<', $filename) or die "could not open '$filename' $!\n";
push @lines, join(' ', shuffle split) for <$data>;
my @line = shuffle <@lines>;
while (my $line = <@line>)
{
foreach ($line)
{
my @fields = split ",",$line;
my $hostname = "$fields[0]";
my $network_interface = get_network_interface();
my $packet_drop = get_packet_drop();
my $do_nothing= get_do_nothing();
print "The server with packet loss of $packet_drop will be\:$hostname";
my $username = "$fields[1]";
my $password = "$fields[2]";
my $cmd1 = "tc \-s qdisc ls dev $network_interface";
my $cmd2 = "tc qdisc add dev $network_interface root netem loss $packet_drop";
my $cmd3 = "tc \-s qdisc ls dev $network_interface";
my $cmd4 = "sleep 30";
my $cmd5 = "tc qdisc del dev $network_interface root netem";
my $cmd6 = "tc \-s qdisc ls dev $network_interface";
my $ssh = Net::SSH::Perl->new("$hostname");
$ssh->login("$username","$password");
my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd1 && $cmd2 && $cmd3 && $cmd4 && $cmd5 && $cmd6");
print $stdout;
}
}
**configuration.pl**
sub get_network_interface {return "eth4"};
sub get_packet_drop {return "30%"};
sub get_do_nothing{return "30"};
这些变量在上面的脚本中使用,并在configuratio.pl
下声明脚本工作正常但它在msec内完成了该过程,尽管为每个服务器提供30秒的睡眠。
脚本应该在一台服务器上实现它,然后等待声明的睡眠,然后它应该删除规则并为下一个服务器运行相同的。
答案 0 :(得分:1)
由于您正在使用&&
链接,因此如果任何早期命令($cmd4
,$cmd1
,{{1},则不会执行睡眠($cmd2
) })失败,因此请打印$cmd3
和$stderr
个变量以查看是否有错误。
如果要检查每个命令的状态,则应单独执行$exit
次呼叫。然后你也可以在命令3和5之间使用Perl cmd
而不是shell sleep
:
sleep
答案 1 :(得分:0)
perl中有sleep
个函数。您可以使用该功能等待一段时间
sleep (n);
其中n是您想要睡觉的秒数。在您的情况下,
sleep(30);