Я нашел ответ на другой вопрос StackOverflow, который, похоже, решил мою проблему - см. Ответ Пола Томблина здесь .
Похоже, что если perl-скрипт выполняет exec (), то apache ждет. Но если Perl-скрипт сначала выполняет форк, а затем форк выполняет exec (), тогда все работает как положено.
И вот как это выглядит в моем коде, заменив то, что было в моем исходном посте:
use POSIX 'setsid';
$SIG{CHLD} = 'IGNORE';
# This should flush stdout.
my $ofh = select(STDOUT);$| = 1;select $ofh;
my $kpid = fork;
if ($kpid)
{
# Parent process
print "Content-type: text/html\n\n";
print "success"; # this gets returned via ajax
}
else
{
close STDIN;
close STDOUT;
close STDERR;
setsid();
my $gpid = fork;
if (!$gpid)
{
open(STDIN, "</dev/null") ;
open(STDOUT, ">/dev/null") ;
open(STDERR, ">/dev/null") ;
# Child process
exec($script_filename, $var1, $var2, $var3) ;
}
exit 0;
}
Спасибо Адаму за то, что он сразу подтвердил, что то, что я первоначально пытался сделать, было ошибочным.
Спасибо Джонатану за то, что он указал мне правильное направление.