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