sous-processus: la suppression de processus enfants dans Windows
Sur Windows, subprocess.Popen.terminate
appels win32 l' TerminalProcess
. Toutefois, le problème que je vois est que le processus fils du processus que je suis en train d'essayer de mettre fin sont toujours en cours d'exécution. Pourquoi est-ce? Comment m'assurer que tous les enfants de processus a commencé par le processus sont tués?
- Voici 2 options 1. Utilisez ce fichier exe comme un sous-processus qui tue les processus d'arbres pour vous: latenighthacking.com/projects/2002/kill 2. Convertir suivants du code C en Python avec ctypes: stackoverflow.com/questions/1173342/...
- La version de Python et de Windows?
Vous devez vous connecter pour publier un commentaire.
En utilisant psutil:
parent.children(recursive=True)
est la construction d'un arbre à la volée par la liaison de parent à enfant, de sorte qu'il ne sera pas trouver des processus orphelins (c'est à dire si le parent est décédé).Utilisation
taskkill
avec le/T
drapeauLes drapeaux pour taskkill a les documents suivants:
Ou de la marche le processus d'arbre à l'aide de comtypes et win32api:
C'est une chose difficile à faire. Windows ne permet pas de stocker une arborescence des processus dans l'espace de processus. Ni est-il possible de mettre fin à un processus et de préciser que c'est les enfants doivent aussi mourir.
Un moyen de contourner cela est d'utiliser taskkill et le dire à wack l'ensemble de l'arbre.
Une autre façon de faire (en supposant que vous êtes le frai de haut niveau) est d'utiliser un module qui a été développé avec ce genre de chose à l'esprit: http://benjamin.smedbergs.us/blog/tag/killableprocess/
Pour ce faire, de manière générique, pour vous-même, vous devez passer un peu de temps à construire la liste vers l'arrière. C'est un processus stocke des pointeurs à ses PARENTS, mais les parents semblent ne pas stocker des informations sur les enfants.
De sorte que vous avez à regarder tous les processus dans le système (ce qui n'est pas vraiment difficile), puis connecter manuellement les points vous-même en regardant le processus parent champ. Ensuite, vous sélectionnez l'arborescence qui vous intéresse et à pied toute chose, tuant chaque nœud à son tour, un par un.
Noter que Windows n'est pas mise à jour le parent d'un enfant pointeur lorsque la mère meurt, il peut donc y avoir des lacunes dans votre arbre. Je ne suis pas au courant de tout ce que vous pouvez faire à propos de ces.
Voici un exemple de code de l'objet de Travail de la méthode, mais au lieu de
subprocess
il utilisewin32api.CreateProcess
Mettre les enfants dans un NT Objet de la tâche, alors vous pouvez tuer tous les enfants
J'ai eu le même problème et juste de le tuer par un moyen de commande de windows avec l'option pour enfant de tuer "/T"
subprocess.Popen()
. Un simpleprocess.terminate()
ouprocess.kill()
ne fonctionne pas sur WIndows 7, ni lepsutils
option ci-dessus, mais ce n'.J'ai utilisé kevin-smyth la réponse de créer un baisse-dans le remplacement pour
subprocess.Popen
qui confine l'enfant créé dans un processus anonyme objet de travail, mis en place pour mettre fin à proximité: