如何在Windows环境中杀死TCL中的后台进程

时间:2012-02-22 17:45:06

标签: tcl

我已经在Windows环境中使用Tcl的exec命令从Tcl程序中启动了iperf作为后台进程。但是,我想在将来的任意时间以编程方式从同一个Tcl程序中杀死iperf进程。我怎样才能做到最好?

这是我正在使用的代码

proc runtest {  REF_WLAN_IPAddr run_time} {
    exec c:\\iperf_new\\iperf -c $REF_WLAN_IPAddr -f m -w 2M -i 1 -t $run_time  >& xx.txt & 
    # have some code after this
} 

但是我看到iperf没有被杀死,所以控件没有转回TCL,我怎么能这样做?答案非常感谢 }

3 个答案:

答案 0 :(得分:6)

如果按照您描述的方式使用,

exec将返回子进程PID列表, 但是Tcl没有内置的kill命令;这些仅在扩展中提供。

所以你有两个主要选择:

  1. 获取TWAPI包http://twapi.magicsplat.com/并使用该包中的end_process函数(请参阅http://twapi.magicsplat.com/process.html#end_process

  2. 使用第二个exec并使用/ PID选项

    运行windows命令taskkill
    exec [auto_execok taskkill] /PID $pid
    

答案 1 :(得分:1)

或者

exec {*}[auto_execok start] C:\\Windows\\System32\\taskkill.exe $pid

exec {*}[auto_execok start] C:\\Windows\\System32\\taskkill.exe /F /IM ProgramName.EXE /T

答案 2 :(得分:0)

这是我使用的骨架脚本:

package require Tclx

puts "main begins"

puts "Launch child script"
set childPid [exec tclsh child.tcl 0 &]
puts "Child PID: $childPid"

puts "Do something now..."
after 1000

puts "Now wait for child to finish"
lassign [wait $childPid] pid howEnded exitCode

puts "Process $pid ended with reason ($howEnded) and exit code ($exitCode)"
puts "main ends"

讨论

  • 脚本(main.tcl)生成子脚本(在您的情况下为child.tcl或ifperf)并将其进程ID记录到childPid
  • 然后主脚本执行某些操作(在这种情况下, 1000之后,它只能睡眠1000毫秒)
  • 主脚本调用 wait 命令等待子进程完成。 Wait返回3个事项的列表:进程ID,结束方式和退出代码
  • 警告:如果孩子之前完成,请致电等待 wait 命令将抛出异常,你需要抓住它。

以下是一个示例运行:

$ tclsh main.tcl 
main begins
Launch child script
Child PID: 25837
Do something now...
  child runs for 16889 miliseconds
Now wait for child to finish
  child ends
Process 25837 ended with reason (EXIT) and exit code (0) 
main ends