gpt4 book ai didi

linux - 需要命令在 perl expect 中并行运行

转载 作者:太空宇宙 更新时间:2023-11-04 10:32:39 25 4
gpt4 key购买 nike

我有一个如下所述的脚本,我看到提到的命令“需要运行的命令”(在 for 循环中)执行了一段时间,后来被派生执行命令的进程被终止,因此仅执行“需要运行的命令”(在 for 循环中)中的部分脚本。相反,我希望“需要运行的命令”(在 for 循环中)中的命令全部并行运行,即如果 for 循环运行 50 次迭代,则需要并行执行 50 个不同的进程,并且不应停止任何进程之间。有人可以对此提出建议吗?

#!/usr/bin/perl

use Expect;

sub hostuser_expect() {
$expect= Expect->new;
$expect->raw_pty(1);
$expect->spawn($cmd)
or die "Cannot spawn $cmd: $!\n";

$expect->expect($timeout,
[ qr/.*\?/i, #/
sub {
my $self = shift;
$self->send("yes\r\n");
exp_continue;
}
]);

$expect->expect($timeout,
[ qr/password:/i, #/
sub {
my $self = shift;
$self->send("$password\n");
exp_continue;
}
]);
#$expect->expect(1500,'-re', 'Mails marked as moved successfully\.$');
#$expect->hard_close();
}

$timeout = 5;
$password = "changeme";

for ($i=1;$i<=50;$i++) {
$cmd="Command which needs to be run";
print "Invoking script - $cmd\n";
hostuser_expect();
sleep(30);
}

最佳答案

我相信Parallel::ForkManager会做你想做的。我不使用 Expect,因此我简化了 sub 作为示例。我还添加了 use strict;use warnings;,从子定义中删除了原型(prototype)括号,并从使用 C 风格的 for() 循环实现。

只需更改对 Parallel::ForkManager->new() 的调用中的数字,即可提高或降低任一时刻要执行的最大 fork 数。

use warnings;
use strict;

use Parallel::ForkManager;

sub hostuser_expect {
my $num = shift;
print "in child $num\n";
}

my $pm = Parallel::ForkManager->new(5);

COMMANDS:
for (1..5){
$pm->start and next COMMANDS;
hostuser_expect($_);
$pm->finish;
}

$pm->wait_all_children;

输出:

in child 1
in child 2
in child 5
in child 3
in child 4

关于linux - 需要命令在 perl expect 中并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124518/

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