如何在从perl运行时在命令中使用变量?

时间:2016-08-08 07:40:28

标签: perl

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秒的睡眠。

脚本应该在一台服务器上实现它,然后等待声明的睡眠,然后它应该删除规则并为下一个服务器运行相同的。

2 个答案:

答案 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);