【发布时间】:2013-12-16 14:54:53
【问题描述】:
我有两个进程正在运行(Windows7 prof 上的 foo.cmd 和 bar.cmd),它们都经常检查另一个进程是否仍在运行。
由于每个进程都知道变量%FPID%中的其他进程的PID,所以我曾经检查过其他进程是否还在这样运行
FOR /F "tokens=1,*" %%a in ('tasklist /FI "PID eq %FPID%" /NH ^| find /C "%FPID%"') do set COUNTP=%%a
如果%COUNTP% 现在大于 0,则其他进程仍在运行。
但时不时地%COUNTP% 等于 0,即使其他进程实际上仍在运行(它仍然写入日志文件)。
一秒钟后,它又可以找到了。
- 哪些情况会导致无法像上面的语句那样通过 ID 找到正在运行的进程?
- 是否有更好/更好/更快的方法来检查某个 PID 的进程是否仍处于活动状态并正在运行(在 Windows 上)?
【问题讨论】:
-
你能解释一下这些批次是如何知道彼此的 pids 的吗,你在脚本前面是否 grep
WMIC PROCESS?我们必须在 WMI 观察程序中复制它才能像您想要的那样工作。还是您在寻求帮助,我应该解释一下? -
感谢您的回答。我像这里 [serverfault.com/questions/126502] 一样获得每个进程的 PID,并将它们写入文件(foo.dat 和 bar.dat)。现在他们可以从文件中读取并将内容保存到变量
%FPID%中,例如set /p FPID=<"C:\tmp\foo.dat"。这非常有效,通常我可以每分钟通过此 ID 识别其他正在运行的进程。每隔约 250 次我就找不到其他进程 - 为什么它对命令tasklist /FI "PID eq %FPID%" /N不可见 -
原因可能是 PID 错误或进程未运行。也许您的看门狗进程重新启动了它,这就是它被发现的原因。我们会在没有看到您的代码的情况下猜测。
-
或者它可能无法在 foo.dat 文件中设置新的 pid。这显示了来自 powershell 的正确 pid,但可以为 WMIC 重写它。
(get-process | where {$_.mainwindowtitle -match "Foo"}|select ID).ID
标签: command-line process cmd pid tasklist