Spawn Expect来自perl线程

时间:2017-05-09 16:06:21

标签: multithreading perl expect.pm

我正在开发一个脚本,需要定期(每5分钟)生成一个Expect进程来完成一些工作。下面是我生成Expect进程并完成一些工作的代码。脚本的主要过程是在任何时候都做一些其他的工作,例如它可能会等待用户输入,因为我在一个每隔5分钟一次调用它的线程中调用这个函数'spawn_expect',但问题是Expect没有按预期工作。

但是,如果我用另一个进程替换线程,那就是我fork并让一个进程负责生成Expect而另一个进程完成脚本的主要工作(例如在提示符处等待)然后Expect工作正常

我的问题是,是否有可能让一个线程产生Expect进程?我是否必须使用流程来完成这项工作?谢谢!

sub spawn_expect {
    my $expect = Expect->spawn($release_config{kinit_exec});
    my $position = $expect->expect(10,
                    [qr/Password.*: /, sub {my $fh = shift; print $fh "password\n";}],
                    [timeout => sub {print "Timed out";}]);
    # if this function is run via a process, $position is defined, if it is run via a thread, it is not defined                         
    ...
 }

1 个答案:

答案 0 :(得分:1)

创建var arr = [{"id":"GROUP1","type":"Water"},{"id":"GROUP2","type":"Beer"},{"id":"GROUP3","type":"Coke"},{"id":"GROUP4","type":"Gin"}], arr2 = [{"GROUP1":1,"GROUP2":0,"GROUP3":0,"GROUP4":0},{"GROUP1":1,"GROUP2":1,"GROUP3":0,"GROUP4":0},{"GROUP1":0,"GROUP2":0,"GROUP3":1,"GROUP4":0},{"GROUP1":0,"GROUP2":1,"GROUP3":1,"GROUP4":1}], hash = arr2.map(v => Object.keys(v).filter(c => !!v[c])), res = hash.map(v => ({name: v.map(c => arr.find(b => b.id == c).type).join(', ')})); console.log(res);对象beforehand(不在线程内)并将其传递给线程

Expect

我测试了多个线程,其中一个使用my $exp = Expect->spawn( ... ); $exp->raw_pty(1); $exp->log_stdout(0); my ($thr) = threads->create(\&login, $exp); my @res = $thr->join(); # ... sub login { my $exp = shift; my $position = $exp->expect( ... ); # ... } 和一个自定义测试脚本,并将脚本的输出返回给主线程。如果我发布这些(短期)课程,请告诉我。

当在一个线程内创建Expect对象时,它也失败了。我的猜测是,在这种情况下,它不能像通常那样设置它的pty。

鉴于评论中的澄清,我会使用Expect来完成这项工作。