Processus.Kill() ne semble pas de tuer le processus
J'ai de la difficulté à l'aide de Process.Kill()
. Je pense que je dois être l'incompréhension comment il fonctionne. C'est ma fonction de test. Je commence un long processus en cours d'exécution (ping -t
) et puis la tuer cinq secondes plus tard.
Je peux voir le processus de ping montrer, mais le processus est toujours là après mon programme se termine. Je dois le tuer manuellement.
Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
Process process = new Process();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.Arguments = "/c ping -t 8.8.8.8";
Console.WriteLine("Staring ping process");
process.StartInfo = startInfo;
process.Start();
Thread.Sleep(5000);
Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
Thread.Sleep(5000);
Console.WriteLine("Killing ping process");
process.Kill();
Thread.Sleep(5000);
Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
Ce que je fais mal?
Testé ton code et il fonctionne très bien. Lorsque vous exécutez ce code?
Windows 8.1. Il a couru à partir de deux PowerShell et cmd.exe.
Aucune différence pour exécuter directement Ping.exe sans cmd?
Cela semble être la question. L'exécution du processus directement semble fonctionner. Aucune idée pourquoi tuer le cmd processus ne fonctionne pas?
parce que Ping est le processus enfant de cmd. Vous tuer cmd mais il ne sera pas aussi tuer tous les enfants, de Ping est toujours en cours d'exécution. Vous pouvez tuer tous les processus de hiérarchie. Voir aussi stackoverflow.com/q/3342941/1207195
Windows 8.1. Il a couru à partir de deux PowerShell et cmd.exe.
Aucune différence pour exécuter directement Ping.exe sans cmd?
Cela semble être la question. L'exécution du processus directement semble fonctionner. Aucune idée pourquoi tuer le cmd processus ne fonctionne pas?
parce que Ping est le processus enfant de cmd. Vous tuer cmd mais il ne sera pas aussi tuer tous les enfants, de Ping est toujours en cours d'exécution. Vous pouvez tuer tous les processus de hiérarchie. Voir aussi stackoverflow.com/q/3342941/1207195
OriginalL'auteur Kris Harper | 2015-05-15
Vous devez vous connecter pour publier un commentaire.
Vous avez commencé cmd.exe puis cmd.exe démarre le processus enfant ping.exe. Pour tuer ping.exe vous pouvez tuer tous les processus de hiérarchie. Par exemple avec WMI(ajouter
System.Management
de référence):Dans cet exemple de code que nous avons tuer ensemble de l'arbre de manière récursive.
Oh bizarre, je dois avoir manqué que quand je l'ai lu plus tôt. Je vais la récompense.
Parent PID peut également être ré-utilisé. Ainsi, lorsque vous tuez tout avec le parent PID comme le pid du processus de sélection, vous pouvez tuer les processus commencé avant la donné un. Vérifier que le temps de démarrage de l'enfant est après l'heure de départ du parent est ici crucial.
Attention, cette réponse devrait être mis à jour pour inverser l'appel récursif à
KillProcessAndChildrens
et l'appel àproc.Kill()
parce que si vous tuez les parents avant que les enfants que vous venez de lâche enfants engendré processus vous permettra de fuite. Voir ma nouvelle proposition.OriginalL'auteur SulNR
C'est un patch pour le @SulNR réponse étant donné sa réponse à la fuite de l'enfant de processus de processus enfants.
OriginalL'auteur Julio
processus.Kill() fonctionne tout simplement pas sur le processus que vous en pensez. Ce que vous faites est fait à partir de 2 processus et seulement tuer le premier processus, tandis que le second processus continue de fonctionner.
Le code que vous avez est le démarrage d'une nouvelle interface de commande et de sauver le processus d'infos à
process
. Lorsque vous appelezprocess.Kill()
seule la commande shell est sortie, Vous pouvez exécuteravant de vous
process.Kill()
pour voir quel processus est en fait va être tué. Par la mise en\c ping -t 8.8.8.8
comme arguments à la commande shell, vous dites la commande shell pour démarrer un autre processus (dans ce cas, la commande ping) et détacher d'elle-même. Votre programme n'a pas de connaissances sur le processus de l'enfant et de ne pas le tuer. Si tout ce que vous voulez vraiment est de tuer le processus de ping vous pouvez modifier votre code pour:Si, toutefois, vous avez vraiment besoin pour démarrer le shell de commande d'abord, vous aurez besoin de trouver de l'enfant et de la logique de tuer. Quelque chose comme:
[MODIFIER]
*Désolé, je n'ai pas vu les commentaires de @Adriano Repetti au premier abord. Je ne veux pas être redondant.
OriginalL'auteur rogergarrison
De ici.
J'ai essayé de lancer mon programme de test à un administrateur à l'invite, et il ne semble pas encore pour tuer le processus.
OriginalL'auteur Matthew Mage