Comment trouver et tuer une boucle php (processus)?

4

J'ai développé un script php qui appelle une API externe dans une boucle. Il est en cours de test sur un serveur VPS qui exécute LAMP sous Debian. J'ai remarqué ce matin que l'API ne répondait pas à mon script. Lorsque j'ai appelé le fournisseur, ils m'ont dit que mon serveur appelait des milliers de fois les heures api depuis 10 heures. Je suppose qu'un script php (sur lequel j'ai travaillé la veille et testé sur mon VPS) est entré dans une boucle infinie pendant l'une des exécutions et n'est jamais sorti (je l'ai testé depuis l'invite de commande, et pas sur le Web.) J'ai tenté d'arrêter et de démarrer Apache, mais le personnel de support technique d'API indique que les appels arrivent toujours depuis l'adresse de mon serveur. Comment puis-je trouver et arrêter le processus? En outre, y at-il une possibilité que l’arrêt / le démarrage d’Apache résolve le problème,

Veuillez me pardonner de ne pas utiliser correctement mon environnement de test local.

Edit: Je ne connais pas le nom du processus, je dois découvrir le nom (ou pid) en fonction du comportement.

Hoytman
la source
Je ne suis pas un expert dans ce domaine particulier, mais Apache n'est pas php. Vous devriez terminer php lui-même, éventuellement avec apache. Apache redirige le trafic vers php. Php l'exécute et il est envoyé à votre navigateur etc.
LPChip
1
Ce que vous devez faire pour arrêter PHP dépend de la configuration de votre environnement. Puisque tuer Apache n'a pas aidé, je suppose qu'il ne tourne pas mod_php (qui intègre l'interprète de PHP dans Apache). Les deux autres options populaires sont php-fpmet php-cgi, vous pouvez donc vous en servir ps ax | grep php-pour savoir laquelle est en cours d’exécution et où. Incidemment, ceux - ci peuvent avoir des scripts de démarrage / d'arrêt dans init.d (php5-fpm pour les anciens)
Powerlord,
En outre, à l'avenir, il existe une astuce soignée, simple et efficace pour éviter une telle quantité d'appels d'API sortants. Cachez simplement tout (pas toujours possible bien sûr) en utilisant quelque chose d'aussi simple que copy('remotefile', 'temporarylocalfile');vous pouvez l'exécuter en tant que tâche cron ou juste dans sa propre boucle infinie avec du temps d'attente intégré. (Ou utilisez simplement n'importe quel utilitaire fourni comme wgetcelui-ci.)
Mario
"Tester à partir de l'invite de commande" implique pour moi que vous exécutiez manuellement le binaire php, soit en utilisant php <nom_script>, soit en utilisant le shebang php en haut du script. Si c'est le cas, vous verrez un processus php dans ps. Quelque chose d'aussi simple que pkill -9 php pourrait être tout ce dont vous avez besoin.
ssnobody
1
Autre commentaire, s'il établit des connexions réseau sortantes vers une API externe, ces connexions s'afficheront dans un netstat. Vous devriez être capable de faire un netstat -anop pour vous montrer toutes les connexions et le PID du processus qui les contrôle. Recherchez l'adresse IP du serveur d'API externe, recherchez l'adresse IP dans la liste netstat, supprimez le PID associé.
ssnobody

Réponses:

13

Puisque vous exécutiez manuellement le binaire php, soit en utilisant php, soit en utilisant le shepang php en haut du script, vous devez trouver son PID et le tuer.

Vous pouvez utiliser pkill -9 phpou si pkill n'est pas présent, vous pouvez utiliser ps -efw | grep php | grep -v grep | awk '{print $2}' | xargs killpour tuer tous les processus php.

De plus, si un processus établit des connexions réseau sortantes vers une API externe, ces connexions s'afficheront dans un netstat.

Vous devriez être capable de netstat -anopvous montrer toutes les connexions et le PID du processus qui les contrôle. Recherchez l'adresse IP / le nom d'hôte du serveur d'API externe, recherchez cette adresse IP / le nom d'hôte dans la liste netstat et supprimez le PID associé.

personne
la source
4
sur un système aussi killall -9 phpoukill -9 $(pidof php)
Alex
1

Si j'ai bien compris votre message, vous avez exécuté un script à partir de PHP-CGI via votre console, indiquant que quelque chose s'est mal passé et que les serveurs de l'API ont été spammés.

Donc, il y a beaucoup de possibilités qui peuvent causer ce problème. Tout d'abord, lorsque vous exécutez un script PHP, achetez simplement en tapant "php scriptname.php", il attend la fin du script PHP puis revient à votre entrée de session principale. Si vous fermez votre shell lors de l'exécution du script, son fonctionnement sera interrompu. Sauf si vous avez démarré votre PHP avec un "écran" ou "&", il n’existe aucune possibilité que le script continue de s’exécuter.

Analysons maintenant son fonctionnement. Si le script passe dans une boucle infinie lors de l'ouverture d'un socket, cela signifie qu'il essaiera de se connecter au serveur de l'API cent fois par seconde. Cela signifie que le serveur cible doit vous bannir des 10 premières secondes. Quelque chose que vous ne nous avez pas clarifié est le débit des demandes de connexion au serveur cible. Est-ce que le support de l'API vous a fourni plus d'informations à ce sujet? Et si oui qu'est-ce qu'ils ont dit.

Cela dit, votre VPS envoie toujours des demandes aux serveurs, je vous suggère de le faire.

ps -A xa | grep php

et vérifier les instances php en cours d'exécution. Vous pouvez aussi avoir accidentellement lancé un script php en arrière-plan en ajoutant un & à la fin de la ligne. Si cette commande retourne quelque chose. Trouvez le pid de l'application et terminez-le avec la commande suivante

tuer -9 pid

Si cela ne fonctionne pas, redémarrez votre vps et demandez-lui s'il lui envoie encore des demandes de connexion (ce qui est actuellement impossible, et cela signifierait que son pare-feu a placé vos paquets en mode lent (ce qui signifie qu'il les a mis en file d'attente avec un retard sur leurs serveurs. ))

Devian
la source