我可以使用nginx / FCGI调用的perl脚本生成一个子进程

时间:2012-04-11 05:02:16

标签: perl nginx expect fastcgi

在由nginix / FCGI调用的perl脚本中,如果我这样做ssh user@ip <command>,它就可以工作,即ti连接到远程机器 但是,如果我这样做 - 期望&gt; spawn(ssh user @ ip),FCGI会在执行打开时返回错误(该代码非常通用,我不指望其中的错误)。如果我使用expect运行脚本作为一个独立的,它的工作原理。 这让我相信FCGI可能不允许进程产生期望。虽然我不确定。到目前为止,谷歌搜索没有帮助。任何投入赞赏

1 个答案:

答案 0 :(得分:2)

它失败的原因是因为Expect.pm尝试复制STDIN并且FCGI.pm不支持该操作,FCGI.pm的下一版本将有一个比Not a GLOB reference at /path/to/perl/lib/...更清晰的错误消息。

解决方案是避免在进行进程间通信时使用全局变量:STDIN,STDOUT,STDERR和%ENV。

my ($stdin, $stdout, $stderr, $env) =
  (IO::Handle->new, IO::Handle->new, IO::Handle->new, {});

my $r = FCGI::Request($stdin, $stdout, $stderr, $env)
  or die "Couldn't create FCGI request: '$!'";

while ($r->Accept >= 0) {
    my $exp = Expect->spawn('ssh', 'user@ip')
        or die "Cannot spawn command: $!\n";
    print $stdout "OK\n";
}