Как остановить процесс летучей мыши на Windows?

11

У меня есть файл BAT, работающий в фоновом режиме в Windows, который длится около десяти минут. Теперь я хочу остановить его во время работы, но не могу найти его имя в списке процессов в диспетчере задач. Так как я могу подойти к этому? Спасибо!

Update1

Кажется трудным остановить запущенный процесс BAT в backgroud. И я решил попробовать уничтожить каждый процесс, связанный с файлом BAT по имени, что может быть перебито. Это приемлемо для меня, так как большинство процессов в моем файле BAT используются не часто, такие как ping, tracert, netstat и т. д. Если у вас есть лучшее решение, пожалуйста, дайте мне знать. Спасибо.

UPDATE2

Дерево процессов BAT

альтернативный текст

SpawnST
источник
1
Как вы запустили файл bat в фоновом режиме? Вы говорите, что не можете сделать Ctrl-C. я бы попробовал break = on, если это не сработало, но вы говорите, что не можете выполнить ctrl-c, потому что это "в фоновом режиме". Может быть, это уже закончилось и закончилось, и вы просто должны убить то, что породило.
Бароп
2
@ barlop, это может быть оправдано в backgroud с ShellExecute(NULL,"open","some.bat",NULL,NULL,SW_HIDE);VC ++.
SpawnST

Ответы:

11

Процессы обычно запускаются в виде дерева, как в моде, я бы посоветовал запустить Microsoft / Sysinternals Process Explorer. Начните с нажатия на Show Process Treeопцию (1), затем найдите свой процесс, щелкните правой кнопкой мыши и выберите Kill Process Tree(2) Это должно уничтожить как исходный файл, так и все, что он запустил.

альтернативный текст

Уильям Хилсум
источник
Убийство Дерева Процессов кажется немного жестким. Может быть достаточно убить родительский процесс (команда bat).
wag2639
1
@ wag2639, прочитав вопрос, я подумал, что он хочет прекратить BAT и порождать процессы? Когда говорят, что процесс занимает так много времени, я понимаю, что когда процессы запускаются, а затем ничего не происходит, пока они не напишут ответ ... Если дерево не завершено, просто будет куча запущенных процессов, которые ничего не делать.
Уильям Хилсум
Я попробовал этот способ и добавил картинку в свой ответ. Спасибо. И теперь я нахожу команду, которая может завершить процесс, запущенный файлом BAT и его taskkill /F /T /IM cmd.exeдочерними элементами. Единственная проблема заключается в том, что каждый файл BAT запускает cmd.exeпроцесс с различным PID. Мне нужно выяснить, какая из них моя цель.
SpawnST
@SpawnST, какой процесс запускает BAT-файл? Вам нужно убить элемент, который его запускает, тогда, если есть несколько копий.
Уильям Хилсум
@ Wil, он запускается процессом MFC / Dialog. Диалог запускает файл BAT только с оконной оболочкой, когда он инициализируется. Теперь я пытаюсь убедиться, что процесс BAT полностью завершен при выходе из диалога.
SpawnST
5

Вы можете изменить командный файл так, чтобы он продолжал работать, используя блокировочный файл, вставляя проверки между командами на наличие файла. Чтобы остановить выполнение командного файла, просто удалите файл блокировки.

Вот демонстрационный пакетный файл:

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

Для насильственного уничтожения процессов, которые могут выполняться в данный момент, вы можете создать пакетный файл kill, который будет содержать команды taskkill для всех задач, которые могут быть запущены из пакетного файла:

del "c:\temp\lockfile"
taskkill /im mytask1.exe
taskkill /im mytask2.exe
harrymc
источник
Это хорошая идея. Но я думаю, что это может вызвать проблемы в моем приложении, например, при длительном выполнении команды tracert.
SpawnST
да, это то, что я делаю сейчас, действительно очень жестоко :-). И, возможно, файл блокировки не нужен в этом решении.
SpawnST
Это необходимо, чтобы пакетный файл не выполнял следующую задачу, когда его текущая задача завершается. В противном случае может произойти, что задача 1 будет завершена, а задача 2 запущена после того, как ее задача уже была выполнена, поэтому пакет kill просто пропустит задачу 2.
harrymc
1

BAT обычно просто запускает экземпляр CMD.exe. В зависимости от того, что делает ваш скрипт, он также запускает другие процессы.

vcsjones
источник
Так есть ли способ остановить его, продолжая запуск других процессов?
SpawnST
1
@SpawnST: Если окно CMD видно, вы не можете просто нажать CTRL + C?
парадоид
@ jason404, как я уже упоминал в вопросе, он работает в фоновом режиме.
SpawnST
1

Я написал приложение, которое может помочь вам, по крайней мере, если BAT работает в окне CMD. Вы можете просмотреть запущенные окна приложения и получить PID приложения, затем убить его с помощью моего приложения, вы также можете увидеть все процессы, которые оно породило, и уничтожить их тоже. Это действительно простая программа, но эффективная для такого рода вещей. Вы также можете использовать его, чтобы отследить, где именно на вашем HD запускается BAT-файл, если вы еще этого не знали.

MaQleod
источник
Я делаю эту работу с VC ++ / MFC, и я думаю, что мне нужны некоторые команды Windows, чтобы сделать это. Спасибо за ответ.
SpawnST
1

Как вызывается командный файл?
Если это из планировщика заданий, то вы также можете остановить его оттуда. Если это из службы, то вы можете остановить службу.

weismat
источник
1

Нашел эту тему на форуме:

http://www.gamedev.net/community/forums/topic.asp?topic_id=261694

Он предлагает использовать ShellExecuteEx (или CreateProcess), чтобы вы могли получить дескриптор процесса, который затем можно использовать для уничтожения процесса.

Крис Хулан
источник
0

Если он открыт в командной строке, вы можете нажать Ctrl+ C. Подождите несколько секунд, и это будет прекращено.

Харви Хопкинс
источник