Je rencontre des problèmes lors de l'exécution d'un processus de longue durée à partir d'un code exécuté sous mod_perl2. Tout fonctionne pour la plupart, mais il semble que le processus forké maintienne les poignées ouvertes dans les fichiers de log d'Apache - cela signifie qu'Apache ne redémarrera pas pendant que le processus est en cours (je reçois un message 'failed to open logfiles') .Comment est-ce que je branche correctement avec mod_perl2?
Voici le code que je utilise:
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";
}
Retour dans les jours mod_perl1, je me souviens à l'aide $r->cleanup_for_exec
pour résoudre ce problème, mais il ne semble pas être pris en charge sous mod_perl2. (Edit: Apparently ce n'est plus nécessaire ..)
Un conseil pour lancer correctement un processus long-fonctionnel sur mod_perl2 sans ces problèmes serait le bienvenu! Essayez de fermer vos poignées STDIN/STDOUT avant le fork.
Salut Dan, comment avez-vous résolu ce problème, je suis confronté au même problème. Plus tôt, j'utilisais mod_perl1 et '$ r-> cleanup_for_exec' fonctionnait bien mais dans mod_perl2 ce n'est plus nécessaire, alors pourriez-vous m'aider à implémenter ceci dans mod_perl2? Merci d'avance. –