在我的TCL脚本中,我正在运行一个可在测试完成后重新运行的进程。但是,有40秒的等待时间可以让程序有足够的时间启动。如果程序正在运行,我不希望有40秒的等待期。无论如何都要搜索并阅读任务列表以确定程序当前是否正在运行?我正在考虑PID,但每次运行程序时它都会发生变化,可能是因为它被放置在不同的内存区域。
我写了一个批处理文件来执行此过程,但我需要将结果传回TCL。有什么办法可以实现吗?
答案 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"
}
/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来检测程序的结束。