确定进程是否正在运行

时间:2013-08-12 19:31:55

标签: windows tcl

在我的TCL脚本中,我正在运行一个可在测试完成后重新运行的进程。但是,有40秒的等待时间可以让程序有足够的时间启动。如果程序正在运行,我不希望有40秒的等待期。无论如何都要搜索并阅读任务列表以确定程序当前是否正在运行?我正在考虑PID,但每次运行程序时它都会发生变化,可能是因为它被放置在不同的内存区域。

我写了一个批处理文件来执行此过程,但我需要将结果传回TCL。有什么办法可以实现吗?

3 个答案:

答案 0 :(得分:2)

如果您没有twapi,可以选择以下方法:使用tasklist.exe

package require csv

proc getPids {imageName} {
    set noTaskMessage "INFO: No tasks are running which match the specified criteria."
    set output [exec tasklist.exe /fi "imagename eq $imageName" /fo csv /nh]
    set pidList {}
    if {$output != $noTaskMessage} {
        foreach line [split $output \n] {
            set tokens [::csv::split $line]
            lappend pidList [lindex $tokens 1]
        }
    }
    return $pidList
}

# Try it out
set imageName chrome.exe
set pids [getPids $imageName]
if {$pids == ""} {
    puts "Process $imageName is not running"
} else {
    puts "PIDs for $imageName: $pids"
}

讨论

  • “图片名称”必须包含扩展程序(例如chrome.exe)
  • /fi标志指定过滤器,在这种情况下,我们要按图像名称
  • 过滤
  • /fo标志指定输出格式:TABLE(默认),LIST和CSV。我选择CSV是因为它最容易解析。
  • /nh告诉tasklist.exe省略标题(AKA无标题)。
  • 如果getPids返回空列表,则该进程未运行。
  • getPids可能会返回多个PID,因此您的代码必须能够处理这种情况。

答案 1 :(得分:1)

是的,这是可能的,但您需要一个Tcl扩展名:Twapi

要检查进程是否正在运行,您可以尝试查找具有特定名称的进程。你可以用这个:

package require twapi
if {[llength [twapi::get_process_ids -name YOUR_EXECUTABLE.EXE]]} {
   puts "Process is currently running"
} else {
   puts "Process not running"
}

有关详细信息,请参阅manual about twapi::get_process_ids

如果您在流程开始/停止时需要通知,则会更加棘手,我必须查找。

答案 2 :(得分:0)

在特殊情况下,你有机会从已启动的程序中读取(或者如果从stdin中读取,则写入程序)你可以打开

set descriptor [open "|myprogram" r]

然后在管道关闭时使用'eof'进行检测(这意味着您必须从此渠道读取数据,例如使用'read')

可能你可以在你的程序周围写一个包装器。这个包装器可以发送到stdout并允许调用tcl-Script来检测程序的结束。