tasklist向taskkill传递参数,问题解决(反思)
由于confbot有内存泄漏的情况,
于是考虑添加进任务列表,让开机启动,每隔20分钟重新启动一次
,,
问题出现啦:
若先前有一个confbot框口开着,在运行中,任务激活,就会有另一个框口出现,先前的
框口并不会自动关闭,这样就达不到想要的结果。
因为是用批处理运行的bot,自然就考虑着通过命令能够找出先前的那个confbot框口进程
然后kill掉,终于找到啦tasklist和对应的taskkill.
〉〉是这样设想的:用tasklist找出先前的框口,用taskkill关闭tasklist找出的这个
框口。
问题总是在解决的过程中越来越多,用
D:/>tasklist /FI "IMAGENAME eq confbot1*" /FI "MEMUSAGE gt 1000"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
confbot1.exe 4032 Console 0 3,168 K
找到啦confbot1(已经看过进程列表,bot的文件名有规律,就这样找啦),可怎样把这
个传给taskkill让他杀掉呢,
别情丝给拉个参数
D:/>tasklist /NH /FI "IMAGENAME eq conf*" /FI "memusage gt 1000"
confbot.exe 212 Console 0 2,852 K
这样更接近弄出那个镜像名
〉〉是这样考虑的:只要能从tasklist的结果中过滤 出镜像名,然后传给taskkill,问
题就解决啦。
终究百思不得其解,“从tasklist传递参数给taskkill“胎死腹中。毕竟不像linux下那
样,传递参数是稀松平常的事,可算得上强项啦,偶可在windows2003下呢。
。。
过啦无数次的思想碰撞,终于看到希望。
D:/>tasklist /FI "IMAGENAME eq confbot1*" /FI "MEMUSAGE gt 1000"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
confbot1.exe 4032 Console 0 3,168 K
D:/>taskkill /FI "IMAGENAME eq confbot1*" /FI "MEMUSAGE gt 1000"
成功: 给进程发送了终止信号,进程的 PID 为 4032。
问题解决啦(偶然发现他俩的过滤选项完全一样。。)。
〉〉其实没那么麻烦,只要一句 taskkill confbot1.exe
进程在内存中的镜像名一般是运行程序的程序名(当然bat文件根本不算程序)。
〉〉想来想去:是自己把自己绕道一个怪圈里啦,在linux下的参数过滤传递管道命令,
误把在linux下的习惯拿到win下用拉。(其实linux下也没这么麻烦,不过linux下麻烦
也能实现!),想啦好多,不写啦,具体的有些想法太凌乱,
下边负伤这两个命令里的参数help
D:/>tasklist /?
TASKLIST [/S system [/U username [/P [password]]]]
[/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
描述:
该工具显示在本地或远程机器上当前运行的进程列表。
参数列表:
/S system 指定连接到的远程系统。
/U [domain/]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示
输入。
/M [module] 列出当前使用所给 exe/dll 名称的所有任务。
如果没有指定模块名称,显示所有加载的模块。
/SVC 显示每个进程中主持的服务。
/V 显示详述任务信息。
/FI filter 显示一系列符合筛选器指定的标准的任务。
/FO format 指定输出格式。
有效值: "TABLE"、"LIST"、"CSV"。
/NH 指定列标题不应该在输出中显示。
只对 "TABLE" 和 "CSV" 格式有效。
/? 显示帮助消息。
筛选器:
筛选器名 有效操作符 有效值
----------- --------------- --------------------------
STATUS eq, ne RUNNING |
NOT RESPONDING | UNKNOWN
IMAGENAME eq, ne 映像名称
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号
SESSIONNAME eq, ne 会话名
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
hh - 时,
mm - 分,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用量,单位为 KB
USERNAME eq, ne 用户名,格式为 [domain/]user
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
MODULES eq, ne DLL 名称
说明: 当查询远程机器时,不支持 "WINDOWTITLE" 和 "STATUS"
筛选器。
示例:
TASKLIST
TASKLIST /M
TASKLIST /V /FO CSV
TASKLIST /SVC /FO LIST
TASKLIST /M wbem*
TASKLIST /S system /FO LIST
TASKLIST /S system /U domain/username /FO CSV /NH
TASKLIST /S system /U username /P password /FO TABLE /NH
TASKLIST /FI "USERNAME ne NT AUTHORITY/SYSTEM" /FI "STATUS eq running"
------------------------------------------
D:/>taskkill /?
TASKKILL [/S system [/U username [/P [password]]]]
{ [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]
描述:
使用该工具按照进程 ID (PID) 或映像名称终止任务。
参数列表:
/S system 指定要连接到的远程系统。
/U [domain/]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果忽略,提示
输入。
/FI filter 应用筛选器以选择一组任务。
允许使用 "*"。例如,映像名称 eq acme*
/PID processid 指定要终止的进程的 PID。
使用 TaskList 取得 PID。
/IM imagename 指定要终止的进程的映像名称。通配符 '*'可用来
指定所有任务或映像名称。
/T 终止指定的进程和由它启用的子进程。
/F 指定强制终止进程。
/? 显示帮助消息。
筛选器:
筛选器名 有效运算符 有效值
----------- --------------- -------------------------
STATUS eq, ne RUNNING |
NOT RESPONDING | UNKNOWN
IMAGENAME eq, ne 映像名称
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号。
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
hh - 时,
mm - 分,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用量,单位为 KB
USERNAME eq, ne 用户名,格式为 [domain/]user
MODULES eq, ne DLL 名称
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
说明
----
1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
2) 远程进程总是要强行 (/F) 终止。
3) 当指定远程机器时,不支持 "WINDOWTITLE" 和 "STATUS" 筛选器。
例如:
TASKKILL /IM notepad.exe
TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
TASKKILL /F /IM cmd.exe /T
TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
TASKKILL /F /FI "USERNAME eq NT AUTHORITY/SYSTEM" /IM notepad.exe
TASKKILL /S system /U domain/username /FI "USERNAME ne NT*" /IM *
TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
最后也附上我的那个bat文件。呵呵,我是把那个大包自解压到%systemroot%目录,然后
运行这个bat文件,人物列表里也是调用的这个bat文件
@echo off
cls
color 0b
set a=%systemroot%/confbot_1_32/dist/
echo D:/>taskkill /FI "IMAGENAME eq confbot1*" /FI "MEMUSAGE gt 1000"
echo ;这句你看着办吧
cmd | %a%confbot.exe "%a%confbot.ini"
嘿嘿,天上拉句
D:/>taskkill /FI "IMAGENAME eq confbot1*" /FI "MEMUSAGE gt 1000"
这里的1000市内存占用大小,若你要用,请根据实际情况调整
〉〉其实又想到一个方法半自动解决哪个bot内存泄漏问题,就是让
D:/>taskkill /FI "IMAGENAME eq confbot1*" /FI "MEMUSAGE gt 1000"
这条命令判断内存占用情况,视情况看是不是要关闭在重新开始运行bot,偶还没实现这个想
法,今天就到这吧 。