Caveat Emptor: я не волшебник Perl.
Как и предположил @JonathanSwartz, я считаю, что проблема в том, что apache2 mod_perl закрывает STDIN и STDOUT.Это не должно относиться к тому, что делает IPC :: Open3, но в нем есть ошибка, описанная здесь .
В заключение (это часть, я не суперснимите флажок), open3 пытается сопоставить дочерние процессы STDIN / OUT / ERR с вашим процессом или продублировать его, если это было запрошено.Из-за недокументированных способов работы open ('> & = X') он обычно работает нормально, за исключением случая, когда закрыты STDIN / OUT / ERR.
Другая ссылка , котораяуглубляется в детали.
Одним из решений является исправление IPC :: Open3, как описано в обеих этих ссылках.Другой, который работал для меня, это временно открыть STDIN / OUT в вашем коде mod_perl, а затем закрыть его:
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страдает от тех же проблем, поэтому, если кто-то столкнется с той же проблемой, я подозреваю, что будет работать то же самое решение.