Question Le planificateur de tâches ne tue que cmd.exe mais pas ses processus enfants


Notre client dispose de serveurs Windows 2003 exécutant des travaux par lots activés par le planificateur de tâches. Les programmes exécutant le travail sont des processus .exe personnalisés. Ils sont ensuite regroupés dans des scripts .cmd afin d'être lancés ensemble par le planificateur de tâches lorsque l'intervalle planifié est respecté. Les lignes dans les scripts cmd peuvent ou non utiliser la commande Appel pour lancer les programmes .exe distincts.

Dans cette configuration, le planificateur de tâches surveille efficacement cmd.exe et, lorsque vous utilisez Process Explorer, vous pouvez observer que les processus .exe enfants sont parqués sous l'arborescence des processus cmd.exe. Toutefois, lorsque le planificateur de tâches supprime cmd.exe en raison du dépassement du délai imparti, les processus .exe enfants ne peuvent pas être supprimés avec leur parent et devenir orphelins. Ces processus restent bloqués indéfiniment. En raison de l'état des threads de processus affichés dans Process Explorer, je soupçonne que ces processus se sont transformés en erreur et ont ouvert une boîte de dialogue de débogueur .NET (il s'agit d'applications .NET) qui ne peut pas être visualisée car l'utilisateur du travail par lots est un utilisateur distinct. Compte.

Initialement, alors que je recherchais ce problème sur mon poste de travail Windows XP, j’ai observé que les processus enfant .exe lancés à partir de mon script test .cmd sont tués avec le cmd.exe lorsque le planificateur de tâches décide que le temps est écoulé. Il était impossible que les processus enfants soient orphelins.

Basé sur une intuition, je suis finalement passé sur une machine Windows 2003 pour le tester. De même, les processus enfants à terminer sont similaires à ceux de mon poste de travail. Ma deuxième étape a ensuite été d'utiliser un autre compte d'utilisateur pour exécuter la tâche planifiée. Cette fois-ci, cmd.exe est tué après le délai imparti, mais les processus enfants restent en attente, à l'image de ce que mon client a observé dans ses serveurs de production.

Si je me connecte de manière préemptive à ce compte utilisateur par lots (qui se trouve être un autre compte administrateur) pour réclamer une session sur le bureau, les erreurs ou les informations en incrustation provenant de mes programmes test .exe seraient routées et restituées sur ce bureau, me permettant de voir la sortie utilisateur réelle. Si je ne me connecte que lorsque la tâche planifiée a été appelée, la session de bureau ne "récupérera" pas les fenêtres des processus existants; ils restent cachés pour toujours.

Ma question est la suivante: quelles sont les conditions qui me manquent et qui peuvent empêcher le planificateur de tâches de supprimer les processus enfants sous un cmd.exe? Quelle est la particularité d'utiliser un autre compte qui provoquerait ce problème, mais pas lorsque vous utilisez mon compte d'administrateur actuel pour exécuter la tâche planifiée?


5
2017-07-29 03:41


origine


Nous avons le meme probleme. Avez-vous déjà résolu ce problème? - Bengt
Non ..... T__T - icelava


Réponses:


Essayez d'utiliser "Taskkill / T" sur la ligne de commande. (/ T = “… Termine le processus spécifié et tous les processus enfants qui ont été démarrés par lui…”)

Si plusieurs processus sont en cours d'exécution (nous avons souvent au moins 5 "powershell.exe" en cours d'exécution), ajoutez la colonne "Ligne de commande" à l'onglet "Détails" du Gestionnaire des tâches. Cela devrait indiquer clairement quel ID de processus est celui que vous voulez tuer


2
2018-02-14 14:55





Les processus sont indépendants dans Windows - La suppression d'un processus parent ne mettra pas automatiquement fin à un processus enfant.


1
2018-03-01 15:04



Si tel est le cas, pourquoi le planificateur de tâches mettant fin à cmd.exe met-il fin aux autres processus .exe dans mes cas de test? - icelava
Pourquoi pas et comment termine-t-on une tâche telle que les processus enfants soient également tués? - bames53
Voir @ Warren-Stevens réponse - Christopher_G_Lewis


Si vous pensez que cela est dû à l’affichage d’un message du débogueur, avez-vous essayé de placer le code dans un fichier try{}catch{} bloquer et consigner l'erreur?

Sinon, vous pourriez peut-être faire en sorte que les processus écrivent la sortie de WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent())

Je soupçonne que les enfants sont en quelque sorte en train d’élever leur niveau de privilège à administrateur et qu’ils ne peuvent ensuite pas être tués avec le parent.

Pour tester cela sans modifier le code, vous pouvez écrire une autre tâche planifiée qui tente de tuer les autres processus à l'aide de taskkill. Cette tâche planifiée doit être exécutée en tant qu'administrateur. Si cela fonctionne, il semble que ce soit un problème de sécurité.


0
2017-07-29 03:51



ces programmes n'ont pas été écrits par nous et nous ne sommes pas autorisés à les modifier, sauf en cas de problèmes graves qui appellent une solution. Ma question ici ne concerne pas le développement d'applications .NET. Il s'agit du planificateur de tâches et du contrôle de l'arborescence des processus. - icelava
Si j'exécute la tâche planifiée sous mon propre compte utilisateur, à savoir l'administrateur, ils peuvent être supprimés. - icelava
Oui, car votre application démarre alors dans le bon contexte de sécurité. Mais je soupçonne que les autres applications renforcent leur contexte de sécurité, ce qui empêche les comptes non-administrateurs de les tuer. - Adam Brand
J'ai mis à jour ma réponse avec une autre approche. - Adam Brand
Mais quand j'ai testé cela en utilisant un autre compte administrateur, le comportement fait surface. - icelava


Que diriez-vous d'utiliser le pskill utilitaire, qui fait partie de la suite SysInternals. Ce programme peut tuer les processus par leur nom. J'ajouterais une tâche planifiée, qui s'exécutera quelques minutes après que les processus soient terminés, qui exécutera pskill pour les terminer.

PSKill peut également s'exécuter sous les informations d'identification de l'utilisateur que vous indiquez sur la ligne de commande.


0
2017-07-29 10:59



Je ne parle pas de processus de mise à mort. Je demande pour quelles raisons un processus enfant devient orphelin ou non après la fin du cmd.exe parent. - icelava


Je ne sais pas si cela résoudra votre problème, mais s'il est lié aux boîtes contextuelles (et cela pourrait être le cas, l'application est dans un état défaillant et est suspendue pendant que l'utilisateur inexistant décide quoi faire à ce sujet) .

Jeter un coup d'œil à http://blogs.msdn.com/shawnfa/archive/2004/07/15/184490.aspxet voyez si vous ne pouvez pas vous débarrasser de ces boîtes ...


0
2017-07-29 14:25



Bien que cette note soit intéressante, je voudrais savoir pourquoi un processus enfant devient orphelin ou non après la fin du cmd.exe parent. - icelava