Jak zatrzymać proces nietoperza w systemie Windows?

11

Mam plik BAT działający w tle w systemie Windows, który trwa około dziesięciu minut. Teraz chcę go zatrzymać, gdy jest uruchomiony, ale nie mogę znaleźć jego nazwy na liście procesów w menedżerze zadań. Jak mogę do tego podejść? Dzięki!

AKTUALIZACJA 1

Wydaje się, że trudno jest zatrzymać działający proces BAT w tle. I postanawiam spróbować zabić każdy proces związany z plikiem BAT według nazwy, który może być przeciążony. Jest to dla mnie dopuszczalne, ponieważ większość procesów w moim pliku BAT nie jest często używana, takich jak ping, tracert, netstat itp. Jeśli masz jakieś lepsze rozwiązanie, daj mi znać.

AKTUALIZACJA 2

Drzewo procesów BAT

alternatywny tekst

SpawnST
źródło
1
Jak sprawiłeś, że plik nietoperza działał w tle? mówisz, że nie możesz zrobić Ctrl-C. spróbuję break = on, jeśli to nie zadziała, ale mówisz, że nie możesz zrobić ctrl-c, ponieważ jest on „w tle”. Być może już się skończył i musisz po prostu zabić to, co się pojawiło.
barlop
2
@ barlop, można go wyliczyć w tle za pomocą ShellExecute(NULL,"open","some.bat",NULL,NULL,SW_HIDE);VC ++.
SpawnST

Odpowiedzi:

11

Procesy zwykle uruchamiane są w sposób podobny do drzewa, radziłbym uruchomić Microsoft / Sysinternals Process Explorer , zacznij od kliknięcia opcji Show Process Tree(1), a następnie znajdź swój proces i kliknij prawym przyciskiem myszy i wybierz Kill Process Tree(2) To powinno zabić zarówno oryginalny plik, jak i wszystko, co uruchomił.

alternatywny tekst

William Hilsum
źródło
Zabicie drzewa procesów wydaje się trochę trudne. Może być wystarczające zabicie procesu nadrzędnego (polecenie bat).
wag2639,
1
@ wag2639, po przeczytaniu pytania pomyślałem, że chce on zakończyć BAT i odrodzić procesy? Kiedy mówi się, że przetwarzanie zajmuje tak dużo czasu, rozumiem, że kiedy procesy się uruchamiają, a potem nic się nie dzieje, dopóki nie wypiszą odpowiedzi ... Jeśli drzewo nie zostanie zakończone, będzie tylko kilka działających procesów, które są nic nie robić.
William Hilsum,
Próbowałem w ten sposób i dodałem zdjęcie do mojej odpowiedzi. Dzięki. Teraz znajduję polecenie, które może zabić proces rozpoczęty przez plik BAT i jego dzieci taskkill /F /T /IM cmd.exe. Jedynym problemem jest to, że każdy plik BAT rozpocznie cmd.exeproces z innym PID Muszę dowiedzieć się, który jest moim celem.
SpawnST
@SpawnST, jaki proces uruchamia plik BAT? Musisz zabić element, który go uruchamia, jeśli jest ich wiele.
William Hilsum,
@ Wil, jest uruchamiany przez proces MFC / Dialog. Okno dialogowe uruchamia plik BAT tylko z powłoką okna podczas inicjalizacji. Teraz staram się upewnić, że proces BAT jest całkowicie uwikłany, gdy okno dialogowe zostanie zamknięte.
SpawnST
5

Możesz zmodyfikować plik wsadowy, aby używał pliku blokującego do kontynuowania działania, wstawiając między poleceniami sprawdzanie istnienia pliku. Aby zatrzymać wykonywanie pliku wsadowego, wystarczy usunąć plik blokady.

Oto plik wsadowy wersji demo:

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

Aby brutalnie zabić procesy, które mogą być wykonującego w tej chwili można utworzyć „kill” plik wsadowy, który będzie zawierał taskkill polecenia dla wszystkich zadań rozpoczętych ewentualnie z pliku wsadowego:

del "c:\temp\lockfile"
taskkill /im mytask1.exe
taskkill /im mytask2.exe
harrymc
źródło
To dobry pomysł, ale myślę, że może to powodować na przykład pewien problem w mojej aplikacji, tracertna przykład gdy polecenie jest wykonywane przez długi czas .
SpawnST
tak, właśnie to robię, naprawdę brutalny :-). Być może plik blokady nie jest potrzebny w tym rozwiązaniu.
SpawnST
Jest to konieczne, aby plik wsadowy nie wykonał następnego zadania po zakończeniu bieżącego zadania. W przeciwnym razie mogłoby się zdarzyć, że zadanie 1 zostanie zakończone, a zadanie 2 uruchomione po zakończeniu jego zadania, więc partia zabijania po prostu nie przejdzie zadania 2.
harrymc
1

BAT zwykle uruchamia po prostu instancję CMD.exe. W zależności od tego, co robi skrypt, uruchomi także inne procesy.

vcsjones
źródło
Czy jest więc jakiś sposób, który może powstrzymać go przed uruchomieniem innych procesów?
SpawnST
1
@ SpawnST: Jeśli okno CMD jest widoczne, czy nie możesz po prostu wpisać CTRL + C?
paradroid
@ jason404, jak wspomniałem w pytaniu, działa w tle.
SpawnST
1

Napisałem aplikację, która może ci pomóc, przynajmniej jeśli BAT działa w oknie CMD. Możesz przeglądać uruchomione okna aplikacji i uzyskać PID aplikacji, możesz następnie zabić ją za pomocą mojej aplikacji, możesz także zobaczyć wszystkie procesy, które ona zaszczepiła i je zabić. To naprawdę prosty program, ale skuteczny do tego rodzaju rzeczy. Możesz go również użyć do śledzenia dokładnie, z którego miejsca na dysku HD działa plik BAT, na wypadek, gdybyś jeszcze tego nie wiedział.

MaQleod
źródło
Robię tę pracę z VC ++ / MFC i myślę, że potrzebuję kilku poleceń systemu Windows, aby to zrobić. Dziękuję za odpowiedź.
SpawnST
1

Jak wywoływany jest plik wsadowy?
Jeśli pochodzi z Harmonogramu zadań, możesz go także zatrzymać. Jeśli pochodzi z usługi, możesz ją zatrzymać.

weismat
źródło
0

Jeśli jest otwarty w wierszu polecenia, możesz nacisnąć Ctrl+ C. Poczekaj kilka sekund, a zostanie zakończone.

Harvey Hopkins
źródło