С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
4 / 4 / 0
Регистрация: 21.05.2011
Сообщений: 80

Убить дочерний процесс, не трогая основной

21.07.2012, 14:27. Показов 5044. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Задача такая, нужно убить дочерний процесс не трогая основной. То есть, имеется процесс proga.exe у него два дочерних update.exe и одноименный proga.exe. Неоходимо завершить только update.exe. Просто taskkill /f update.exe нельзя, поскольку завершаться все процессы с таким именем.

Реализуемо ли это с помощью CMD, возможно с какими нибудь сторонними консольными утилитами?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.07.2012, 14:27
Ответы с готовыми решениями:

Запущен ли процесс? или Завершен ли дочерний процесс моей программы?
Моя программа выполняет execute('cmd', '/C ...'). На момент execute-а других экземпляров cmd.exe нет. Мне хочется узнать, когда окошко cmd...

Родительский и дочерний процесс: процесс не переходит обратно к родителю
Здравствуйте знаю что тема уже была, но все же! создаю элементарную программу, пока просто 1 дочерний процесс, но после запуска родителя...

Есть процесс A и дочерний процесс B, который находит хэндл родительского процесса A. И этот хэндл в разных случаях РАЗНЫЙ! Почему?
Друзья! Вот код A.exe, суть которого просто стать родительским для B.exe и висеть в системе. #include <stdio.h> #include...

8
 Аватар для icu
59 / 44 / 6
Регистрация: 07.05.2010
Сообщений: 52
22.07.2012, 17:59
примерно таким куском в батнике можно решить задачу:

Code
1
2
3
4
5
6
set PARENT=proga.exe
set CHILD=update.exe
 
for /F "tokens=1 skip=1" %%A in ('wmic.exe path win32_Process where "Name='%PARENT%'" get ProcessID') do (
  wmic.exe path win32_Process where "Name='%CHILD%' and ParentProcessID=%%A" delete
)
В переменную %%A получаем PID, запущенных в системе родительских процессов proga.exe. В теле цикла убиваем все процессы update.exe, порожденные от процессов с PID равным %%A.
3
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.07.2012, 18:42
Delete? - разве не Terminate
1
 Аватар для icu
59 / 44 / 6
Регистрация: 07.05.2010
Сообщений: 52
22.07.2012, 19:21
Лучший ответ Сообщение было отмечено как решение

Решение

здесь DELETE - команда для оболочки wmic.exe - убить экземпляр класса.
а TERMINATE - метод того самого экземпляра класса. При его использовании вместо DELETE нужно писать CALL TERMINATE

Чуть хелпа от самой консоли wmic:
Code
1
2
3
4
5
6
7
8
9
10
11
12
wmic:root\cli>path win32_Process /?
 
Escapes to full WMI object paths.
USAGE:
 
PATH (<path expr> | (<class path expr> [WHERE <where clause>])) ASSOC [<format specifier>]
PATH (<path expr> | (<class path expr> [WHERE <where clause>])) CALL <method name> [<actual param list>]
PATH (<path expr> | (<class path expr> [WHERE <where clause>])) CREATE <assign list>
PATH (<path expr> | (<class path expr> [WHERE <where clause>])) DELETE
PATH (<path expr> | (<class path expr> [WHERE <where clause>])) GET [<property list>] [<get switches>]
 
wmic:root\cli>
4
2 / 1 / 1
Регистрация: 19.07.2022
Сообщений: 3
19.07.2022, 05:23
Доброго времени всем.

Моя задача чем-то похожа на эту. Требуется отслеживать появление дочернего процесса dw20.exe и если он появился, то убивать его, а так же родительский proga.exe.
0
6969 / 2863 / 1100
Регистрация: 06.06.2017
Сообщений: 9,712
19.07.2022, 17:45
neur0n, похожа, но другая. Мониторинг и два процесса на завершение. Кидаем сюда запрос на vbs, скину решение.
0
2 / 1 / 1
Регистрация: 19.07.2022
Сообщений: 3
21.07.2022, 04:24
FlasherX, спасибо, но vbs потом может быть.

В общем, после нескольких бессонных ночей родила гора мышь )))

Что эта "мышь" делает? Сначала (секция checking1) проверяет запущен ли процесс proga.exe. Если не запущен, то завершает свою работу (уходит в секцию pause). Если запущен, то пытается выяснить и сопоставить PID proga.exe и PID dw20.exe (dw20.exe как дочернего по отношению к proga.exe). В секции checking2 проверяется действительно ли запущен этот дочерний dw20.exe. Если не запущен, то с самого начала повторяет проверку (уходит в секцию setvalues) через 1 минуту (секция tmt1) (таким образом мониторит появление дочернего dw20.exe у proga.exe). Если такой dw20.exe запущен, то завершает и его работу, и работу родительского proga.exe (секции killchild и killparent). После этого сразу с самого начала повторяет проверку (уходит в секцию setvalues).

Работает, как ни странно ))) Проверено на Windows 10 x64.

Если строку 47 (goto killparent) изменить на goto setvalues, то будет мониторить и завершать только дочерние dw20.exe без завершения их родительского proga.exe, что больше соответствует теме.

Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
@echo off
color 1F
title Killing of child and parent processes
setlocal enabledelayedexpansion
:setvalues
set "parent=proga.exe"
set "child=dw20.exe"
set "parentpid="
set "childpid1="
set "childpid2="
goto checking1
:checking1
for /f "tokens=2 skip=1" %%a in ('tasklist /fi "imagename eq %parent%" /nh') do (
  set "parentpid=%%a"
  echo %date% %time:~,-3% - The %parent% is running
  for /f "tokens=2 skip=1" %%b in ('wmic.exe path win32_Process where "Name='%child%' and ParentProcessID=!parentpid!" get ProcessID') do (
    set "childpid2=%%b"
    for /f "tokens=1 skip=1" %%c in ('wmic.exe path win32_Process where "Name='%child%' and ParentProcessID=!parentpid!" get ProcessID') do (
      set "childpid1=%%c"
      goto checking2
    )
  )
)
if !parentpid! equ !0! (
  echo %date% %time:~,-3% - The %parent% is not running
  goto pause
)
:checking2
if !childpid2! equ !0! (
  echo %date% %time:~,-3% - The %child% is not running
  goto tmt1
)
if !childpid2! gtr !0! (
  echo %date% %time:~,-3% - The %child% is running
  @echo.
  goto killchild
)
:tmt1
timeout /t 60 /nobreak>nul
cls
goto setvalues
:killchild
echo %date% %time:~,-3% - Killing of %child% and its child processes
@echo.
taskkill /pid !childpid1! /f /t
@echo.
goto killparent
@echo.
:killparent
echo %date% %time:~,-3% - Killing of %parent% and its child processes
@echo.
taskkill /pid !parentpid! /f /t
@echo.
goto setvalues
:pause
@echo.
@pause
exit
0
6969 / 2863 / 1100
Регистрация: 06.06.2017
Сообщений: 9,712
22.07.2022, 02:02
Цитата Сообщение от neur0n Посмотреть сообщение
спасибо, но vbs потом может быть.
А зря. Дёргать бесконечно tasklist и wmic вредно и долго.
0
2 / 1 / 1
Регистрация: 19.07.2022
Сообщений: 3
24.07.2022, 04:01
Лучший ответ Сообщение было отмечено moonden как решение

Решение

FlasherX, посмотрю как будет работать мой код. Дело в том, что vbs мне наверняка нужно будет "допиливать" под свои "хотелки", а это значит, что нужно будет самому вникать в суть, изучать ещё и эту тему. Но от предложения не отказываюсь. Будет время - сделаю запрос.

Доработал код. Теперь обнаруживает все процессы с именем proga.exe. Дочерние dw20.exe - сначала поэтапно завершает их работу (если их несколько), и только потом - родительского proga.exe. Если строку 61 (goto killparent) изменить на goto setvalues, то будет мониторить и завершать только дочерние dw20.exe без завершения их родительского proga.exe. Если строку 24 (goto pause) изменить на goto tmt1, то дополнительно будет постоянно проверять запущен ли процесс proga.exe, а не завершать свою работу, если он не запущен.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
@echo off
color 1F
title Killing of child and parent processes
setlocal enabledelayedexpansion
:setvalues
set "parent=proga.exe"
set "child=dw20.exe"
set "tmt1=60"
set "tmt2=60"
set "parentpid="
set "childpid1="
set "childpid2="
set "childpid3="
goto checking1
:checking1
for /f "tokens=2 skip=1" %%a in ('tasklist /fi "imagename eq %parent%" /nh') do (
  set "parentpid=%%a"
  if !parentpid! gtr !0! (
    echo %date% %time:~,-3% - The %parent% ^(PID !parentpid!^) is running
  )
)
if !parentpid! equ !0! (
  echo %date% %time:~,-3% - The %parent% is not running
  goto pause
)
(for /f "tokens=2 skip=1" %%b in ('wmic.exe path win32_Process where "Name='%child%' and ParentProcessID='!parentpid!'" get ProcessID') do (
  set "childpid2=%%b"
))>nul 2>&1
(for /f "tokens=1 skip=1" %%c in ('wmic.exe path win32_Process where "Name='%child%' and ParentProcessID='!parentpid!'" get ProcessID') do (
  set "childpid1=%%c"
  goto checking2
))>nul 2>&1
:checking2
if !childpid2! equ !0! (
  echo %date% %time:~,-3% - The %child% is not running
  goto tmt2
)
if !childpid2! gtr !0! (
  echo %date% %time:~,-3% - The %child% ^(PID !childpid1!^) is running
  goto killchild
)
:tmt1
echo.
echo %date% %time:~,-3% - Waiting for the launching %parent%
echo.
timeout /t %tmt1% /nobreak>nul
cls
goto setvalues
:tmt2
echo.
echo %date% %time:~,-3% - Waiting for the launching %child%
echo.
timeout /t %tmt2% /nobreak>nul
cls
goto setvalues
:killchild
echo.
echo %date% %time:~,-3% - Killing of %child% ^(PID !childpid1!^) and its child processes
echo.
taskkill /pid !childpid1! /f /t
goto killparent
:killparent
(for /f "tokens=2 skip=1" %%d in ('wmic.exe path win32_Process where "Name='%child%' and ParentProcessID='!parentpid!'" get ProcessID') do (
  set "childpid3=%%d"
))>nul 2>&1
if !childpid3! equ !0! (
  echo.
  echo %date% %time:~,-3% - The %child% is not running, killing of %parent% ^(PID !parentpid!^) and its child processes
  echo.
  taskkill /pid !parentpid! /f /t
)
echo.
goto setvalues
:pause
echo.
pause
exit
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2022, 04:01
Помогаю со студенческими работами здесь

Дочерний процесс
Скажите, пожалуйста, где описывать дочерние процессы. То есть я создаю, допустим в Visual c++ процессы при помощи CreateProcess и после...

Дочерний процесс
Как передать аргумент size в дочерний процесс?) Как объявить массив??? На ubuntu компилятор gcc компилит под СИ и объявить массив с...

Заморозить дочерний процесс
Помогите,можно пример заморозки дочернего процесса? Я не знаю как это сделать,уже минут 20 гуглю,ничего подобного нету :/

Завершить дочерний процесс
как можно завершить дочерний процесс не трогая основной тема на форуме есть но там про bat , а как это реализовать на c# ? в интернете...

Создать дочерний процесс
Помогите пожалуйста с программой на C++. Экзамен по операционным системам. Нужно создать дочерний процесс. Процесс вычисляет определенный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru