Witam. Potrzebuję taki skrypt, który będzie śledził, czy dany proces wysyła lub pobiera pakiety do Internetu, a gdy już przestanie je wysyłać lub pobierać, to po minucie ma zabić ten proces. Skrypt ma działać pod system Windows Server 2003.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SETLOCAL ENABLEEXTENSIONS
CLS
:OuterLoop
SET strProcessName=
SET /A intInfoDisplayed=0
SET /P strProcessName="Nazwa procesu (bez rozszerzenia): "
IF NOT DEFINED strProcessName (
ECHO.
ECHO Nazwa procesu nie zostala podana.
ECHO.
GOTO :OuterLoop
)
:InnerLoop
SET strPID=
SET /A intState=0
FOR /F "tokens=2" %%i IN ('TASKLIST /NH /FI "IMAGENAME eq !strProcessName!.exe" ^| FIND "!strProcessName!.exe"') DO SET strPID=%%i
IF NOT DEFINED strPID (
ECHO.
ECHO Proces o nazwie !strProcessName!.exe nie istnieje.
ECHO.
GOTO :OuterLoop
)
IF !intInfoDisplayed! EQU 0 (
ECHO.
ECHO ID procesu o nazwie !strProcessName!.exe jest rowne !strPID!.
SET /A intInfoDisplayed=1
)
ECHO.
ECHO Sprawdzanie polaczen...
ECHO Protokol ^| Adres Lokalny ^| Adres obcy ^| Stan
FOR /F "tokens=1,2,3,4" %%i IN ('NETSTAT -no ^| FIND "!strPID!"') DO (
ECHO %%i ^| %%j ^| %%k ^| %%l
IF /I %%l EQU ustanowiono SET /A intState=1
)
IF !intState! EQU 0 GOTO :KillProcess
TIMEOUT /T 5 /NOBREAK
GOTO :InnerLoop
:KillProcess
ECHO.
ECHO Proces o nazwie !strProcessName!.exe zostanie zakonczony.
ECHO.
TIMEOUT /T 60 /NOBREAK
ECHO.
TASKKILL /PID !strPID!
Nie wiem, czy Timeout działa na Win Server 2003. Jeśli nie działa to zastąp to polecenie za pomocą Sleep (albo przy pomocy czegoś innego). Ja powyższy kod testowałem na Win 7 i raczej jest OK. Jest jedno ale … skrypt ten został przygotowany dla aplikacji, które korzystają z protokołu TCP, dla UDP trzeba by wprowadzić zmiany, ale to już możesz się bawić sam.
Rozumiem. Mogłeś w tamtym temacie napisać o tym, bo kto wie, może się komuś przyda ta aplikacja. Zresztą jak zamiast skryptu z tego tematu znajdziesz jakąś aplikację, to też daj znać.
A odnośnie samego kodu … Możesz trochę poprawić jego wydajność jeśli fragment kodu odpowiedzialny za pobieranie ID procesu przerzucisz do zewnętrznej pętli (label OuterLoop). Możesz też zastanowić się, czy wolisz, żeby informacje wyświetlały się na ekranie, czy też były zapisywane w jakimś pliku.