Назад | Перейти на главную страницу

Справка по пакетному файлу, необходимая для 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 или что-то еще, если необходимо)

В этом случае вам, вероятно, понадобится PowerShell. Манипуляция датой и временем в пакетных файлах довольно сложна (например, вы даже не можете надежно получить текущую дату / время), также сравнивая произвольные типы данных.

В PowerShell это тривиально:

Get-Process | where { $_.StartTime -lt (Get-Date).AddHours(-4) } | Stop-Process

ETA: Подумав еще немного, это может быть достаточно просто в пакетном файле, я изучу его позже сегодня и посмотрю, смогу ли я заставить что-то работать.

Поскольку вы более знакомы с bash, попробуйте следующее:

pslist| mawk "$1 == 'FMSCore' && int(substr($8,1,1)) >= 4 {print 'pskill '$2}" | cmd

Вы можете скачать mawk отсюда: http://www.klabaster.com/freeware.htm#mawk

(эта версия awk отлично подходит для win32)