如何退出TCL进程,而不退出在该进程内运行的进程

如何退出TCL进程,而不退出在该进程内运行的进程,tcl,expect,Tcl,Expect,在下面的程序中,我想在第2个进程中捕获数据包,而ping在第1个进程中运行。现在如果我执行这个程序,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 "*>"

在下面的程序中,我想在第2个进程中捕获数据包,而ping在第1个进程中运行。现在如果我执行这个程序,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)
}

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

完全未测试:尝试在后台启动ping:
发送“ping 30.1.1.2&\r”
与expect的异步操作
expect\u background
可能是相关的,但代码不能像那样直线编写。我不知道expect和8.6的协同程序是否能很好地协同工作……但如果不能,我也不会感到惊讶。嗨,格伦,谢谢你的评论。对发送“ping 30.1.1.2&\r”在其linux计算机上有效。我正在使用思科路由器,它不支持和功能。嗨,多纳尔,非常感谢你的评论。希望你的背景在没有proc的情况下工作得很好。你好,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的情况下运行相同的脚本时,其工作状态良好,如下所示: