2013-12-16 4 views
0

У меня есть два процесса (foo.cmd и bar.cmd на Windows7 prof), которые часто проверяются, если другой процесс все еще запущен. Поскольку каждый процесс знает PID другого процесса в переменной %FPID%, я использовал, чтобы проверить, если другой процесс все еще работает как этотКак найти процесс windows по идентификатору процесса на командной строке

FOR /F "tokens=1,*" %%a in ('tasklist /FI "PID eq %FPID%" /NH ^| find /C "%FPID%"') do set COUNTP=%%a 

Если %COUNTP% теперь больше, чем 0, то другой процесс все еще работает ,

Но время от времени %COUNTP% было равно 0, даже если другой процесс все еще работал (он все еще записывается в лог-файлы). Через секунду его можно было найти снова.

  • Какие обстоятельства могут привести к тому, что не будет найден текущий процесс по его идентификатору, как в случае с вышеприведенным утверждением?
  • Есть ли лучший/лучший/более быстрый способ проверить, активен ли процесс для определенного ПИД-регулятора (в окнах)?
+0

Можете ли вы объяснить, как эти партии знают друг друга, вы использовали grep 'WMIC PROCESS' раньше в скрипте? Нам нужно будет воспроизвести это в WMI-наблюдателе, чтобы он работал так, как вы хотите. Или вы просите о помощи, как это сделать, и я должен объяснить это? –

+0

Спасибо за ваш ответ. Я получаю PID каждого процесса, как здесь [http://serverfault.com/questions/126502], и записываю их в файлы (foo.dat и bar.dat). Теперь они могут просто прочитать из файла и сохранить содержимое в переменной '% FPID%' like 'set/p FPID = <" C: \ tmp \ foo.dat "'. Это работает очень хорошо, и обычно я могу идентифицировать другой текущий процесс с помощью этого идентификатора каждую минуту. всего через ~ 250-й раз я не могу найти другой процесс - почему он может быть невидим для команды 'tasklist/FI 'PID eq% FPID%"/N' – Preexo

+0

Причина, вероятно, в том, что PID ошибочен или процесс не работает. Возможно, ваш сторожевой процесс перезапустил его, и именно поэтому он был найден. Мы будем гадать, не увидев ваш код. – foxidrive

ответ

0

Сверху моей головы я просматриваю класс __InstanceDeletionEvent для наблюдателя событий WMI. Если вы выберете этот маршрут, этот снимок доставит вас в правильном направлении, любезно создайте WMI Code Creator.

В основном WMI будет ждать и обнаруживать, когда $ pid закрывается и выполняет команды в течение 1 секунды после этого.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _ 
("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance.ProcessId = 1900") 

Wscript.Echo "Waiting for events ..." 
Do While(True) 
    Set objReceivedEvent = objEvents.NextEvent 

    'report an event 
    Wscript.Echo "__InstanceDeletionEvent event has occurred." 

Loop 
Смежные вопросы