我怎么能让perl等到一个命令完成后继续执行for循环的其余部分

时间:2016-02-22 20:23:30

标签: perl

我有以下脚本(只是摘录,其他部分不相关):

@output = $con->cmd("show module | grep ignore-case \"Supervisor Module\" | cut -d \" \" -f 1");

for (@output[1 .. $#output]) {
    print "******* Supervisor Slot $_ *******\n";
    @suboutput = $con->cmd("slot $_ quoted 'show system internal raid'");
    print "@suboutput";
    print "\n";
}

我一直遇到一个问题,脚本会到达@suboutput行,然后看起来转到脚本中的其他行而不允许@suboutput行完成。这导致@suboutput数组在我打印时被缩短。

有没有办法让脚本在继续执行脚本的其余部分之前等待命令完成?我正在考虑使用睡眠命令,虽然我不确定是否有更具体/万无一失的方法让脚本等待。

我的另一个想法是让脚本等到子输出数组包含一个确切的行“somehostname#”(#之后没有其他文本,只是somehostname#)。只要@suboutput行命令执行完毕,就会出现这一行,见下面看看我在说什么:

somehostname# slot 5 quoted "show system internal raid"
RAID data from CMOS = 0x61 0xb7
RAID data from driver disks 0 bad 0 name
Current RAID status info:
Bootflash: /dev/sdb
Mirrorflash: /bin/cat: /var/log/boot_node_mirror: No such file or directory

Personalities : [raid1]
unused devices: <none>
Personalities : [raid1]
unused devices: <none>
/bin/cat: /var/log/raid_monitor.log: No such file or directory
/bin/cat: /var/log/raid_repair.log: No such file or directory
Current RAID status:
Bootup RAID status:
RAID Monitor log:
RAID repair log:
---------------------------------------------------
somehostname#

我再次不确定是否有更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:0)

我们最终通过添加新驱动程序(非perl相关)和更新的perl模块来解决此问题。

我们联系了HP(执行此perl脚本的服务器软件的发布者),他们确定了服务器&amp;脚本在执行slot x quoted ....命令时感到困惑,并且过早地切断了输出。 HP提供的更新文件通过允许HPNA和perl脚本正确确定命令何时实际执行完毕来解决问题。