Comment arrêter un processus de chauve-souris sous Windows?

11

J'ai un fichier BAT exécuté en arrière-plan sur Windows qui dure environ dix minutes. Maintenant, je veux l'arrêter pendant qu'il est en cours d'exécution, mais je ne trouve pas son nom dans la liste des processus dans le gestionnaire de tâches. Alors, comment puis-je aborder cela? Merci!

UPDATE1

Il semble difficile d'arrêter un processus BAT en cours d'exécution dans backgroud.Et je décide d'essayer de tuer tous les processus impliqués par le fichier BAT par leur nom, ce qui peut être excessif.C'est acceptable pour moi car la plupart des processus de mon fichier BAT ne sont pas utilisés fréquemment, tels que ping, tracert, netstat, etc.Si vous avez une meilleure solution, faites-le moi savoir.Merci.

UPDATE2

Arbre de processus BAT

texte alternatif

SpawnST
la source
1
Comment avez-vous fait fonctionner le fichier bat en arrière-plan? vous dites que vous ne pouvez pas faire ctrl-c. j'essaierais break = on si cela ne fonctionne pas, mais vous dites que vous ne pouvez pas faire ctrl-c car c'est "en arrière-plan". Peut-être qu'il a déjà couru et fini, et il suffit de tuer ce qu'il a engendré.
barlop
2
@ barlop, il peut être excuté en backgroud avec ShellExecute(NULL,"open","some.bat",NULL,NULL,SW_HIDE);en VC ++.
SpawnST

Réponses:

11

Les processus sont généralement lancés sous la forme d'un arbre, je conseillerais de lancer Microsoft / Sysinternals Process Explorer , commencez par cliquer sur l' Show Process Treeoption (1), puis trouvez votre processus et faites un clic droit et choisissez Kill Process Tree(2) Cela devrait tuer à la fois le fichier d'origine et tout ce qu'il a lancé.

texte alternatif

William Hilsum
la source
Tuer l'arbre de processus semble un peu lourd. Il peut être suffisant de tuer le processus parent (la commande bat).
wag2639
1
@ wag2639, après avoir lu la question, je pensais qu'il voulait mettre fin aux processus BAT et générés? Quand on dit que le processus prend tellement de temps, je comprends que lorsque les processus sont lancés et que rien ne se passe jusqu'à ce qu'ils écrivent une réponse ... Si l'arborescence n'est pas terminée, il y aura juste un tas de processus en cours d'exécution qui sont Ne rien faire.
William Hilsum
J'ai essayé de cette façon et ajouté l'image dans ma réponse.Merci.Et maintenant, je trouve une commande qui peut tuer un processus démarré par le fichier BAT et ses enfants.Le taskkill /F /T /IM cmd.exeseul problème est que chaque fichier BAT démarrera un cmd.exeprocessus avec un PID différent Je dois déterminer lequel est ma cible.
SpawnST
@SpawnST, quel processus lance le fichier BAT? Vous devez tuer l'élément qui le lance puis s'il y a plusieurs copies.
William Hilsum
@ Wil, il est démarré par un processus MFC / Dialogue. La boîte de dialogue n'exécute le fichier BAT avec le shell de la fenêtre qu'une fois qu'elle est initialisée.
SpawnST
5

Vous pouvez modifier le fichier de commandes afin qu'il utilise un fichier de verrouillage pour continuer à fonctionner, en insérant des vérifications entre les commandes pour l'existence du fichier. Pour arrêter l'exécution du fichier batch, supprimez simplement le fichier de verrouillage.

Voici un fichier batch de démonstration:

echo xx > "c:\temp\lockfile"
pause
if not exist "c:\temp\lockfile" goto  exit
pause
del "c:\temp\lockfile"
:exit

Pour tuer violemment les processus en cours d'exécution, vous pouvez créer un fichier batch 'kill' qui contiendra les commandes taskkill pour toutes les tâches éventuellement lancées à partir du fichier batch:

del "c:\temp\lockfile"
taskkill /im mytask1.exe
taskkill /im mytask2.exe
harrymc
la source
C'est une bonne idée, mais je pense que cela peut causer des problèmes à mon application lorsqu'une commande s'exécute pendant une longue période, tracertpar exemple.
SpawnST
Oui, c'est ce que je fais maintenant, vraiment violent en effet :-) Et peut-être que le fichier de verrouillage n'est pas nécessaire dans cette solution.
SpawnST
Il est nécessaire pour que le fichier de commandes n'exécute pas la tâche suivante lorsque son fichier actuel est terminé. Sinon, il pourrait arriver que la tâche1 soit terminée et que la tâche2 soit démarrée une fois que sa tâche a déjà été exécutée, de sorte que le lot de mise à mort manquera simplement la tâche2.
harrymc
1

Une BAT lance généralement juste une instance de CMD.exe. Selon ce que fait votre script, il démarrera également d'autres processus.

vcsjones
la source
Existe-t-il un moyen de l'empêcher de continuer à démarrer d'autres processus?
SpawnST
1
@SpawnST: Si la fenêtre CMD est visible, ne pouvez-vous pas simplement taper CTRL + C?
paradroid
@ jason404, comme je l'ai mentionné dans la question, il fonctionne en arrière-plan.
SpawnST
1

J'ai écrit une application qui pourrait vous aider, au moins si le BAT s'exécute dans une fenêtre CMD. Vous pouvez afficher les fenêtres d'application en cours d'exécution et obtenir le PID de l'application, vous pouvez ensuite la tuer avec mon application, vous pouvez également voir tous les processus qu'elle a engendrés et les tuer également. C'est un vrai programme simple, mais efficace pour ce genre de chose. Vous pouvez également l'utiliser pour localiser exactement sur votre disque dur le fichier BAT, au cas où vous ne le saviez pas déjà.

MaQleod
la source
Je fais ce travail avec VC ++ / MFC, et je pense que j'ai besoin de quelques commandes Windows pour le faire.Merci pour la réponse.
SpawnST
1

Comment le fichier de commandes est-il appelé?
S'il provient du Planificateur de tâches, vous pouvez également l'arrêter à partir de là. S'il s'agit d'un service, vous pouvez arrêter le service.

weismat
la source
0

Si vous l'avez ouvert dans l'invite de commande, vous pouvez appuyer sur Ctrl+ C. Attendez quelques secondes et il sera terminé.

Harvey Hopkins
la source