Я хотел бы попросить некоторую помощь в создании командного файла для запуска на сервере 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)