【问题标题】:How do I check for spawn_id that's alive? (TCL)如何检查 spawn_id 是否存在? (TCL)
【发布时间】:2018-02-08 05:33:08
【问题描述】:

我向主机生成了一个 telnet 进程。我发送一个命令,期待一些东西 作为回报。这会持续一段时间。但介于两者之间 互动,与主机的连接神秘地失去了,我的 脚本在尝试向生成的对象“发送”某些东西时死亡(现在已经死了) 远程登录进程。 我想编写一个带有 spawn id 和命令的程序 作为参数发送。我想检查 spawn id 是否存在 (即程序和主机之间存在连接)在我之前 “发送”命令。否则,我想退出。 像这样的:

proc Send {cmd sid} {
if { $sid is not dead yet } { ;## don't know how to do this
part
send -i $sid "$cmd\r"
} else {
puts "channel id: $sid does not exist anymore. Exiting"
exit
}
}

【问题讨论】:

    标签: tcl expect


    【解决方案1】:

    您可以catchsend 在发送到死进程时引发的错误而不是检查生成的进程是否仍然存在:

    proc Send {cmd sid} {
        if {[catch {send -i $sid "$cmd\r"} err]} {
            puts "error sending to $sid: $err"
            exit
        }
    }
    

    【讨论】:

    • 是的,我现在使用的是相同的 catch 和 err 方法。但在这里我不想出来.. 如果 spawn_id 不存在,我想再次打开另一个 telnet 会话到同一服务器,然后发送命令。
    • @Tanuj 您想重新连接而不是简单的“投诉并退出”?因此,您用重新连接替换该代码中的putsexit,然后您再次尝试send 命令。除了你现在也必须改变外界对sid 的认识……它开始变得非常混乱;看起来你的界面因素不完善。
    • 仅供参考:上面的“if”语句中有一个额外的“}”会导致“args:应该是“proc name args body”错误。 StackOverflow,它的无限智慧不允许我对原始答案进行 1 个字符的编辑。
    【解决方案2】:

    我之前遇到过这个问题,使用 Mac/Linux ps 命令来做到这一点:

    if {[catch {exec ps $pid} std_out] == 0} { 
        puts "Alive"
    } else {
        puts "It's dead, Jim"
    }
    

    如果您使用的是 Windows,我听说 tlist.exe 命令执行类似的操作,但我没有 Windows 机器来测试它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多