Справка по пакетному файлу, необходимая для PsList/PsKill, когда процесс превышает определенный возраст (прошедшее время)

Я хотел бы попросить помощи в создании пакетного файла для запуска на сервере Windows, который будет отслеживать процессы, которые иногда «зависают» и задерживаются после того, как их нужно убить.

В частности, я вижу «возраст» процесса в столбце «Истекшее время» команды PsList http://technet.microsoft.com/en-us/sysinternals/bb896682.aspx

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
FMSCore            4908   8 146  892 750720     0:01:46.221     4:02:15.907
FMSCore            4780   8 144  943 853060     0:00:42.510     4:02:15.348
FMSCore            3532   8 146  878 553784     0:01:30.262     2:04:56.969
FMSCore            5384   8 147  753  45484     0:00:03.198     0:05:11.267
FMSCore            9548   8 133  608  17408     0:00:00.592     0:00:34.298

Следующий шаг: я хочу убивать только процессы старше 4 часов. Поэтому я считаю, что нам нужно будет проанализировать результаты моей команды PsList, извлечь последний столбец, анализировать в течение нескольких часов, и если мы обнаружим, что он «достаточно старый», мы разберем его PID и уничтожим его.

Если бы мы говорили о bash или каком-то другом языке сценариев, я думаю, что мог бы понять это, но для пакетного сценария я не знаю.

рекомендации?

(примечание: я бы хотел запустить скрипт autoit или что-то еще, если это необходимо)


person zeroasterisk    schedule 22.07.2010    source источник


Ответы (2)


setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
FOR /F "tokens=2,10* skip=8 delims=: " %%A IN ('pslist') DO (
    if %%B GEQ 4 echo should kill pid %%A, elapsedhrs=%%B
)

Обратите внимание, что

  • skip=8 — отфильтровать информацию об авторских правах и версии pslist, может зависеть от версии
  • Не будет работать с exe-файлами с пробелами в имени файла!
  • Здесь также будут перечислены системные процессы, такие как smss, winlogon, svchost и т. Д., И вам не следует их убивать (поэтому не запускайте это как систему, также могут возникнуть проблемы, если запускать от имени администратора с повышенными правами).

Если фильтрация по процессорному времени приемлема, можно использовать простую встроенную команду: tasklist /FI "CPUTIME ge 04:00:00"

Вероятно, лучше решить эту проблему с помощью Windows Scripting Host или Powershell (перечислите процессы с помощью WMI, таким образом вы получите реальные объекты и не будете иметь дело со строками)

person Anders    schedule 23.07.2010
comment
Отлично - спасибо за информацию ... не решает проблему, которую я пытался решить, но дает мне полезную информацию. Спасибо! - person zeroasterisk; 31.07.2010

Так что я на самом деле понял это сам - мне пришлось использовать AutoIt и дополнительный фильтр, чтобы посмотреть аргументы командной строки для каждого процесса, а затем посмотреть прошедшее время каждого процесса, а затем убить старые.

Вот полный пост:

http://zeroasterisk.com/2010/07/23/adobe-connect-fmscore-process-killer/

Мы настроили Connect для истечения срока действия процессов FMSCore через 2 часа, но если кто-то все еще подключен к записи, он сохранит старый зомби-процесс FMSCore, пока этот человек не отключится.

Часто случается, что это не работает — и, похоже, не существует сборщика мусора для очистки старого FMSCore.

Итак, мы создали простой скрипт AutoIt, который можно скомпилировать в EXE-файл, который работает, но имеет некоторые зависимости…

Все следующие зависимости/команды должны быть на месте:

  • c:\Windows\system32\pv.exe
  • c:\Windows\system32\pslist.exe
  • c:\Windows\system32\pskill.exe

Как это работает

  • сценарий использует pv.exe для поиска всех процессов FMS Core, у которых есть аргумент командной строки, включающий «flvplayerapp» (только для записанных курсов)
  • для каждого из возвращенных идентификаторов процесса
  • он использует pslist для перечисления деталей, которые включают возраст процесса
  • он использует совпадение с регулярным выражением, находит «часы работы»
  • если более 5 часов (настраиваемый параметр), он использует pskill, чтобы убить процесс.

Итак, мы настроили это на почасовую запланированную задачу, и она обрабатывает сборку мусора для нас.

http://zeroasterisk.com/blog/wp-content/uploads/2010/07/fmscore-killer-source.au3_.txt

person zeroasterisk    schedule 30.07.2010