Tuez un processus qui continue de redémarrer

16

Et si 'kill -9' ne fonctionne pas? ou Comment tuer un script qui démarre de nouveaux processus? ne m'aide pas de toute façon.

J'ai un script python qui démarre automatiquement avec un autre identifiant de processus utilisant le même port lorsqu'il est tué en utilisant sudo kill -9 <pid>.

$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  13242 ubuntu    3u  IPv4  64592      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill -9 13242
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16106 ubuntu    3u  IPv4  74792      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill 16106
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16294 ubuntu    3u  IPv4  75677      0t0  TCP localhost:3002 (LISTEN)

Ce n'est pas un processus Zombie.

$ ps -Al

4 S     0 16289     1  0  80   0 - 12901 poll_s ?        00:00:00 sudo
4 S  1000 16293 16289  0  80   0 -  1100 wait   ?        00:00:00 sh
0 S  1000 16294 16293  0  80   0 - 34632 poll_s ?        00:00:00 python

J'ai même essayé sudo pkill -f <processname>sans succès . Il ne veut pas mourir.

Mise à jour:

C'est le processus parent shdont le parent est sudocomme mentionné dans le tableau ci-dessus. Je ne sais pas s'il est sûr de les tuer brusquement. Il s'agit également d'un serveur Ubuntu partagé.

Lakshminarayanan Guptha
la source
On dirait qu'il se meurt très bien. Votre lsofsortie affiche un nouveau pid à chaque fois. Le processus redémarre simplement.
Patrick
Oui, il ne veut pas mourir pour toujours. Se réveille comme s'il n'était jamais mort :(
Lakshminarayanan Guptha

Réponses:

26

Démarre automatiquement avec un autre ID de processus signifie qu'il s'agit d'un processus différent. Il y a donc un processus parent, qui surveille ses enfants, et si l'un meurt, il est réapparu par le parent. Si vous souhaitez arrêter complètement le service, découvrez comment arrêter le processus parent. Le tuer SIGKILLest bien sûr l'une des options, mais probablement pas The Right One TM , car le moniteur de service peut avoir besoin de faire un peu de nettoyage pour s'arrêter correctement.

Pour trouver le processus de surveillance, vous devrez peut-être inspecter toute la liste des processus, car les écouteurs réels peuvent se dissocier de leurs parents (généralement par le fork() + setsid()combo). Dans ce cas, je trouve la sortie de ps faux(du procpsmoins, peut varier pour d'autres implémentations) plutôt pratique - elle répertorie tous les processus dans une arborescence hiérarchique. Sauf s'il y a eu un habillage PID (voir aussi wikipedia ), le PID du moniteur doit être plus petit que le PID de tous les auditeurs (à moins bien sûr que vous n'atteigniez un enveloppement PID).

peterph
la source
Son parent est shdont le parent est sudo. Est-il acceptable de les tuer?
Lakshminarayanan Guptha
Parent de quel processus? Celui qui écoute sur le port 3002? Dans ce cas, répertoriez tous les processus et devinez lequel est le moniteur. Avec Linux procps, je trouve généralement que la sortie de ps -fauxest suffisamment informative. Notez également que le PID du moniteur doit être plus petit que le PID de l'écouteur réel (à moins que vous n'ayez le système en place depuis un certain temps et que les PID soient déjà encapsulés depuis le démarrage du service, bien sûr).
peterph
Génial. ps -fauxaidé à commencer à tuer du parent. Pouvez-vous mettre à jour votre réponse avec la solution du commentaire?
Lakshminarayanan Guptha
Oui, j'y pensais ... :)
peterph
ps fauxa aidé à détecter le supervisordredémarrage sans fin du démon de file d'attente Laravel
antongorodezkiy
4

Si vous connaissez le port d'écoute du processus, vous pouvez l'utiliser fuseravec -kflag.

Quelque chose comme,

fuser -k 3002/tcp
Ramesh
la source