【问题标题】:How to exit from TCL proc, without exiting process running inside that proc如何退出 TCL proc,而不退出该 proc 内运行的进程
【发布时间】:2014-06-24 09:03:18
【问题描述】:

在下面的程序中,我想在 2nd proc 中捕获数据包,而 ping 在 1st proc 中运行。现在如果我执行这个程序,proc 正在运行 ping 并退出它。有解决此问题的想法吗?

我的 TCL 代码:

proc connect {} {
    global spawn_id
    spawn telnet $1.1.1.1
    expect "*ogin:"
    send "admin\r"
    expect "*word:" 
    send "test\r"
    expect "*>"
    send "ping 30.1.1.2\r"  ; # Ping here
    expect "*#"
}

proc pktcap {} {
    spawn telnet $2.2.2.2
    expect "*ogin:"
    send "admin\r"
    expect "*word:" 
    send "test\r"
    expect "*>"
    send "enable\r"
    expect "*#"
    send "service pktcap on interface vlan 2\r"  ; # capture here, see the ICMP packets
    expect "*#"
    set data $expect_out(buffer)
}

【问题讨论】:

  • 完全未经测试:尝试在后台启动 ping:send "ping 30.1.1.2 & \r"
  • 期望的异步操作? expect_background 可能是相关的,但代码不能像那样直线编写。我不知道 expect 和 8.6 的协程是否可以很好地协同工作……但如果不是,我不会感到惊讶。
  • 嗨,格伦,感谢您的评论。是的。如果它的 linux 机器发送“ping 30.1.1.2 & \r”可以工作。我用的是cisco路由器,不支持&功能。
  • 您好,Donal,非常感谢您的评论。没有 proc,expect_background 可以正常工作。

标签: tcl expect


【解决方案1】:

使用open 命令的“管道”语法。像这样:open "|ping 30.1.1.2" r。唯一的(次要)问题是您需要关闭从open 命令返回的文件描述符 - 进程完成时它不会自动关闭。这里有更多示例:Tcl's wiki

【讨论】:

  • 嗨,Googie,感谢您的回答。如果我使用 open "|ping 10.1.1.2\r" ,是的,ping 命令正在后台运行。但是一旦 ping 完成,之后就会开始数据包捕获。我想在 ping 运行时运行 pktcap(以捕获那些 ICMP 数据包)。如果您有任何想法,请建议我。
  • 我不太明白你的问题。您说 ping 已经在后台运行(使用“管道打开”),那么是什么阻止您在打开“ping 管道”后立即运行 pktcap?
  • 我想同时运行 ping 和 pktcap。现在,一旦 ping 完成,则只有 pktcap 启动。是否可以在 pktcap 运行时指定 ping 应在后台连续运行?
  • 当您执行open "|ping 30.1.1.2" r 时,它会在后台连续运行,对吗?所以你可以立即启动pktcap,它会同时运行。
  • 不,ping 没有连续运行。当 proc 退出时它也存在。当我在没有 proc 的情况下运行相同的脚本时,它的工作正常,如下所示:
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多