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

Пакетный файл, убивающий определенный процесс

Я использую следующий сценарий, чтобы убить процесс в состоянии CLOSE_WAIT, который прослушивает определенный IP-адрес и определенный порт.

FOR /F "tokens=5 delims= " %%I IN (
    'netstat -ano ^| find "127.0.0.1:5900" ^| find "CLOSE_WAIT"'
) DO (
    taskkill /PID %%I
)

Скрипт выполняет свою работу, но я ищу небольшую модификацию.

Я бы хотел, чтобы процесс был убит только в том случае, если в состоянии CLOSE_WAIT больше 10 подключений. Если предположим, что в CLOSE_WAIT всего 3 соединения, то процесс не должен быть остановлен.

Вот моя попытка.

Я использовал несколько приемов из этого поста: https://stackoverflow.com/questions/2913231/how-do-i-increment-a-dos-variable-in-a-for-f-loop

echo off

set /a c=1
setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=5 delims= " %%I IN (
    'netstat -ano ^| find "127.0.0.1:5900" ^| find "CLOSE_WAIT"'
) DO (
    set /a c=c+1
    set /a last=%%I
)
if %c% geq 10 (
   taskkill /PID !last!
)

endlocal

По сути, во время цикла я просто увеличиваю переменную. В конце концов, если счет больше 10, я убиваю задачу.

Ограничение: учитываются только строки, возвращаемые netstat и finds, и использует последний подсчитанный PID для тасккилла. Предполагается, что все строки имеют один и тот же PID, но это верно только в некоторых случаях (например, в вашем случае, когда вы ищете адрес и порт).