Utilisation de PHP posix_kill () dans Linux provoquant un comportement étrange

Je crée une page Web qui sera utilisée pour surveiller et contrôler certains programmes C personnalisés. J’ai créé une page qui va démarrer / arrêter un programme de lancement ‘programme de lancement’ (joli nom générique) qui crée ensuite un certain nombre de processus enfants. Le démarrage fonctionne exec("cd launcher_dir; nohup ./launcher > outfile 2>&1 &");exec("cd launcher_dir; nohup ./launcher > outfile 2>&1 &");

L’arrêt est là où il y a un problème. Après avoir cliqué sur le bouton d’arrêt, une des deux choses se passe au hasard. Il y a soit une page d’erreur du navigateur (101 Connection Reset ou 324 Empty Response) ou la page est chargée deux fois, mais vous ne la voyez que la deuxième fois. La raison pour laquelle je sais qu’il charge deux fois est à cause des messages de débogage dans le code. Dans les deux cas, le processus de lancement est tué (envoyé SIGTERM). Mais si la page se charge deux fois, la première fois qu’elle tue le lanceur (rien ne se charge sur la page pour cette partie) et la deuxième fois, elle vérifie qu’aucun processus de lancement ne s’exécute et affiche un message: “Launcher ne fonctionne pas”.

J’écris des messages de débogage dans un fichier et trouve que le rechargement se produit à une ligne quelque peu variable dans le code php (parfois un certain message de débogage sera imprimé, d’autres fois il ne le fera pas). aucune erreur n’est donnée.

Le lanceur attrape SIGTERM, envoie tour à tour SIGTERM à ses processus enfants, puis appelle exit (0).

Fait intéressant, si SIGKILL est utilisé pour tuer le lanceur, le php fonctionne correctement et comme prévu, cela ne permet cependant pas au lanceur de s’arrêter correctement. Que pourrait-il se passer ici?

Voici le code php pertinent:

 function stop_launcher(){ $pid = get_launcher_pid(); // Definitely returns the correct pid debug_message("stop_launcher called, pid = ".$pid); if ($pid == "") { // If no 'connection reset' error occurs this is displayed // after first executing the else branch. Why is the php being run twice? print "Launcher doesn't seem to be running.. 
"; exit; } else { debug_message("killing"); posix_kill(intval($pid), 15); //SIGTERM debug_message("kill finished"); // Sometimes this message is written, sometimes not if (ps_exists($pid)) { // Definitely works. This never gets displayed print "Shutdown failed. Try again
"; exit; } } } function debug_message($message){ $fh = fopen(".debug", 'a') or die("can't open file"); fwrite($fh, date("-r").": ".$message."\n"); fclose($fh); }

Toutes les suggestions sont appréciées!

Il s’avère que c’était l’un de ces bugs qui vous fait vous sentir stupide! Le programme de lancement a accidentellement tué son groupe de processus …

Le lanceur est la coquille. Certains obus enverront SIGTERM à leurs enfants s’ils reçoivent SIGTERM. Changer “nohup” à “exec nohup” devrait éliminer le problème.