買者自負:我我不是一個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