У меня проблемы с разветвлением длительного процесса из некоторого кода, работающего под mod_perl2.
По большей части все работает, но кажется, что разветвленный процесс держит открытые дескрипторы файлов журнала Apache - это означает, что Apache не перезапускается, пока процесс запущен (я получаю сообщение «Не удалось открыть файлы журнала»).
Вот код, который я использую:
use POSIX; # required for setsid
# Do not wait for child processes to complete
$SIG{CHLD} = 'IGNORE';
# fork (and make sure we did!)
defined (my $kid = fork) or die "Cannot fork: $!\n";
if ($kid) {
return (1, $kid);
}else {
# chdir to /, stops the process from preventing an unmount
chdir '/' or die "Can't chdir to /: $!";
# dump our STDIN and STDOUT handles
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
# redirect for logging
open STDERR, '>', $log_filename or die "Can't write to log: $!";
# Prevent locking to apache process
setsid or die "Can't start a new session: $!";
# execute the command
exec( $cmd, @args );
die "Failed to exec";
}
Еще во времена mod_perl1 я помню, как использовал $r->cleanup_for_exec
для решения этой проблемы, но, похоже, он не поддерживается в mod_perl2. (Изменить: Очевидно, что это больше не требуется .. )
Мы будем очень благодарны за любые советы о том, как правильно запустить длительный процесс из mod_perl2 без этих проблем!
$r->cleanup_for_exec
работал нормально, но в mod_perl2 это больше не требуется, не могли бы вы помочь мне реализовать это в mod_perl2? Заранее спасибо. - person Nikhil Jain   schedule 14.06.2013