Board logo

标题: [系统相关] [已解决]批处理怎样监控进程? [打印本页]

作者: Death    时间: 2010-5-31 10:27     标题: [已解决]批处理怎样监控进程?

请问:
我想做一个进程监控的批处理。
批处理怎么监控进程阿。
比如:
进程A.exe我只想他保持5个同运行多了的直接结束阿。~

[ 本帖最后由 Death 于 2010-5-31 16:22 编辑 ]
作者: Batcher    时间: 2010-5-31 11:58

超过5个的时候,结束哪个?还是需要全部结束?
作者: Death    时间: 2010-5-31 13:33

超过5个结束进程A.exe
但是不是全部结束,结束多出来的进程A.exe
进程A.exe始终保持5个运行。
谢谢大大了。~

[ 本帖最后由 Death 于 2010-5-31 13:35 编辑 ]
作者: caruko    时间: 2010-5-31 15:20

  1. set "num=0"
  2. :loop
  3. for /f "tokens=2" %%i in ('tasklist ^|findstr "A.exe"') do (
  4.         if not defined %%i set %%i=%%i & set /a num+=1
  5.         if %num% GTR 6 taskkill /pid %%i /T &set /a num-=1&set "%%i="
  6. )
  7. ping 127.1>nul
  8. goto :loop
复制代码

[ 本帖最后由 caruko 于 2010-5-31 15:43 编辑 ]
作者: Death    时间: 2010-5-31 15:47

很感谢4L的大大给出来的代码但是没有起到做用
我运行了6个A.EXE但是它没有关闭多出来的那个A.EXE
作者: hanyeguxing    时间: 2010-5-31 15:47

  1. :han
  2. @echo off&setlocal enabledelayedexpansion
  3. for /f "tokens=1,2" %%a in ('tasklist /fo list /fi "Imagename eq qq.exe"') do if /i "%%a"=="pid:" set/a ye+=1&if !ye! gtr 5 taskkill /pid %%b /f>nul
  4. ping -n 10 127.1 >nul&&Endlocal&&goto:han
复制代码
ping 用来延迟时间

[ 本帖最后由 hanyeguxing 于 2010-5-31 15:51 编辑 ]
作者: del    时间: 2010-5-31 16:12

  1. @echo off
  2. if "%~1" neq "h" (
  3.     echo 正在隐藏批处理...
  4.     >"%temp%\tmp.vbs" echo createobject("wscript.shell"^).run """%~f0"" h",0
  5.     "%temp%\tmp.vbs"
  6.     exit /b
  7. )
  8. : --------------- 设置 ---------------
  9. set 进程名=A.exe
  10. set 进程数量=5
  11. set "检测间隔时间=5000" // 单位是毫秒
  12. : --------------- /设置 --------------
  13. >"%temp%\tmp.vbs" echo Wscript.Sleep %检测间隔时间%
  14. SetLocal EnableDelayedExpansion
  15. :Loop
  16. set Count=
  17. set PID=
  18. for /f "tokens=2" %%a in ('tasklist /nh /fi "imagename eq !进程名!"') do (
  19.     set /a Count += 1
  20.     if !Count! gtr %进程数量% (
  21.         set PID=!PID! /PID %%a
  22.     )
  23. )
  24. if defined PID taskkill /f %PID% >nul
  25. "%temp%\tmp.vbs"
  26. goto Loop
复制代码

[ 本帖最后由 del 于 2010-5-31 16:18 编辑 ]
作者: Death    时间: 2010-5-31 16:21

谢谢各位大大。~
谢谢大大们给出的代码。~
作者: caruko    时间: 2010-6-8 12:59

写的时候没做测试,忘记开变量扩展,少了一句,另外 GTR 6改成GTR 5
这个只会结束后开的进程,先开的5个进程不会结束
如果用户结束了前5个进程中的几个,不够5个了,后开的还是会结束掉
解决需要再加几句代码,检测某个PID进程是否存在,这里就不写了
  1. @echo off&setlocal enabledelayedexpansion
  2. set "num=0"
  3. :loop
  4. for /f "tokens=2" %%i in ('tasklist ^|findstr "A.exe"') do (
  5.         if not defined %%i set %%i=%%i & set /a num+=1
  6.         if %num% GTR 5 taskkill /pid %%i /T &set /a num-=1&set "%%i="
  7. )
  8. ping 127.1>nul
  9. goto :loop
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2