繁体   English   中英

我可以使用 nginx/FCGI 调用的 perl 脚本中的 expect 生成子进程吗

[英]Can I spawn a child process using expect from a perl script invoked by nginx/ FCGI

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

它失败的原因是因为 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";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM