/ / Comment bifurquer un processus de mod_perl2 qui tue son parent - perl, centos, fork, apache2.2, mod-perl2

Comment créer un processus de mod_perl2 qui tue son parent - perl, centos, fork, apache2.2, mod-perl2

J'ai lu de nombreux sujets sur ce sujet et essayé à peu près tout ce que j'ai rencontré: > /dev/null, qx, system, exec, fork, cmd avec | (lequeltravaillé sous win32, mais maintenant je "porte sur CentOS qui utilise la préfork MPM), echo | at now, et Proc :: Daemon, mais je n'ai pas essayé Apache2 :: Subprocess car il semble que c'est exactement ce que je ne veux pas, un fil qui est lié au parent.

Peut-être que ma situation est différente. À la fin d'un processus de restauration de base de données de longue durée, Je veux redémarrer le tout httpd service à partir duquel le script s'exécute. Mis à part les questions de la sagesse d'une telle conception, comment puis-je faire cela? Chaque méthode que j'ai essayée arrête le script dès qu'il exécute le sudo service httpd stop moitié de sudo service httpd restart donc ça ne recommence jamais tout seul.

La seule exception à cela est l'écho | maintenant, quisemblait prometteur, mais si je copie quelque chose qui fonctionne quand je le fais sur la ligne de commande et l'exécute dans le script mod_perl, j'obtiens une belle ligne de sondage réussie comme job 1 at 2013-10-31 19:20 mais alors rien ne se passe. Pas de courrier shell avec now -m, aucun message d'erreur avec 2>&1 et / ou > /path/with/all/777/perms, aucun e-mail de mon propre module qui le fait normalement sur n'importe quel die, aucun fichier journal du même qui enregistre tout automatiquement. Juste un échec silencieux malgré la ligne de succès.

Au cas où cela aiderait, voici ce que service httpd stop s'exécute:

stop() {
echo -n $"Stopping $prog: "
kill -TERM `cat ${pidfile}`
RETVAL=$?
if [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
then success
else failure
fi
echo
}

Cela semblait vraiment simple auparavant et il y a tellement de solutions suggérées, mais aucune ne semble le faire. Qu'y a-t-il d'autre à vérifier ou à essayer?

Réponses:

0 pour la réponse № 1

Ce qui a finalement fonctionné était de voler un indice dans les documents Apache2 :: SubProcess ".

Dans le script mod_perl, je fais juste qx($command 2>&1) bien que d'autres méthodes puissent fonctionner aussi.

Ensuite, dans le script appelé dans la commande $, je mets simplement ces lignes avant le redémarrage httpd:

use POSIX "setsid";
setsid or die "Can"t start a new session: $!";

Il ne revient jamais au script mod_perl, ce qui est correct, car je redirige de toute façon vers une page d’affichage du journal.

Pendant ce temps, le script contenant le redémarrage produit correctement le journal via la même ancienne redirection STDOUT que j'avais auparavant, et m'envoie un e-mail si quelque chose dies.

De plus, le script contenant le redémarrage fonctionne normalement à partir de la ligne de commande, comme il a également été conçu pour le faire.