买者自负:我我不是一个perl向导。
正如@JonathanSwartz所建议的,我认为问题在于apache2 mod_perl关闭了STDIN和STDOUT。这与IPC :: Open3没有什么关系,但它有一个缺陷,described here。总之(这是我没有超清楚的部分),open3会尝试将子进程STDIN/OUT/ERR与您的进程匹配,或者如果请求发生了重复,那么open3会尝试将子进程与STDIN/OUT/ERR进行匹配。由于一些未公开的方式('> & = X')起作用,除了STDIN/OUT/ERR关闭的情况以外,它通常工作正常。
Another link深入细节。
一个解决方案是修复IPC :: Open3,如这两个链接中所述。另外,这工作对我来说,是/ OUT在你的mod_perl代码临时打开STDIN,然后再把其关闭:
my ($save_stdin,$save_stdout);
open $save_stdin, '>&STDIN';
open $save_stdout, '>&STDOUT';
open STDIN, '>&=0';
open STDOUT, '>&=1';
#make your normal IPC::Open3::open3 call here
close(STDIN);
close(STDOUT);
open STDIN, '>&', $save_stdin;
open STDOUT, '>&', $save_stdout;
而且,我注意到周围约IPC :: RUN3患净一堆投诉同样的问题,所以如果有人遇到同样的问题,我怀疑同样的解决方案会起作用。
我想你是在正确的轨道上! – Ryley 2014-06-19 15:34:25