11
votes

Démarrer un démon de PHP

Pour un site Web, j'ai besoin de pouvoir démarrer et arrêter un processus de démon. Ce que je fais actuellement est xxx

le processus de démon est démarré, mais Apache / PHP est suspendu. Faire un PS AUX a révélé que sudo s'est transformé en un processus de zombie, tuant efficacement tous les autres progrès. Est-ce que ce comportement normal en essayant de démarrer un Daeomon à partir de PHP?

et oui, Apache a le droit d'exécuter la commande /etc/init.d/daemontostart . J'ai modifié le fichier / etc / sudoers pour lui permettre de le faire. Non, je n'ai pas autorisé Apache d'être capable d'exécuter un ordre de commandement, juste un peu limité pour permettre au site Web de travailler.

De toute façon, retour à ma question, est-il un moyen d'autoriser PHP Démarrer des démons d'une manière dont aucun processus de zombie n'est créé? Je demande cela parce que lorsque je fais l'inverse, arrêtez un démon déjà démarré, fonctionne juste bien.


2 commentaires

Ne devrait-il pas y avoir de Démarrer argument?


Vrai, j'ai oublié d'ajouter ça à la question. Dans mon code, je l'avoir. Mais je vais éditer la question de la complétude.


3 Réponses :


13
votes

Essayez Ajout > / dev / null 2> & 1 & à la commande.

Donc, donc ceci: xxx

juste au cas où vous Voulez-vous savoir ce qu'il fait / pourquoi:

  • > / dev / null - Rediriger stdout à / dev / null (Blackhole It, en d'autres termes)
  • 2> & 1 - rediriger stardr to stdout (Blackhole aussi bien)
  • & Détachez le processus et exécutez en arrière-plan

4 commentaires

Merci pour l'explication plus poussée, mais parce que la sortie est blackhed, tout code qui aurait dû être exécuté après le démarrage du démon, est surviennent à ASWELL. Je dois vérifier si le processus a commencé, mais ce code n'est jamais tiré ...


Lorsque vous démarrez un processus en utilisant cette méthode, il devrait émettre le PID du processus créé. Vous pouvez prendre cela, puis (par exemple) exécuter ps | grep $ pidofprocessyoujuststarted pour vous assurer qu'il fonctionne.


En fait, vous pourriez simplement exécuter ps | grep /etc/init.d/daemontostart Pour faire la même chose ...


Je sais que je le fais déjà. ;) Il semblait que ce code n'a jamais été exécuté, car mon navigateur ne m'a pas présenté une alerte avec la valeur de résultat que j'ai présentée. Mais mes journaux montrent que le code est en train d'être exécuté. Alors merci encore.



0
votes

Je n'ai jamais essayé de démarrer un démon de PHP, mais je avez essayé d'exécuter d'autres commandes shell, avec beaucoup de problèmes. Voici quelques choses que j'ai essayées, dans le passé:

  • Selon la réponse de Davandandom, append / dev / null 2> & 1 & à la fin de votre commande. Cela redirigera les erreurs de sortie standard. Vous pouvez ensuite utiliser cette sortie pour déboguer.
  • Assurez-vous que le chemin de votre utilisateur de votre serveur Web contient tous les fichiers binaires référencés dans votre script de démon. Vous pouvez le faire en appelant EXEC ('echo $ path; whoami;) . Cela vous indiquera que l'utilisateur PHP fonctionne sous et sa variable de chemin actuelle.

0 commentaires

2
votes

J'ai eu le même problème.

Je suis d'accord avec Daverandom, vous devez supprimer chaque sortie (stdout et stardr). Mais pas besoin de lancer dans un autre processus avec la fin " & code> ': la fonction EXED () ne peut plus vérifier le code de retour et retourne ok même s'il y a une erreur ... p>

et je préfère stocker des sorties dans un fichier temporaire, au lieu de "Blackhole". Solution de travail: P>

$output = explode("\n", file_get_contents($temp));
@unlink($temp);


0 commentaires