【问题标题】:Using expect multiple times in /usr/bin/expect在 /usr/bin/expect 中多次使用 expect
【发布时间】:2015-11-13 02:57:40
【问题描述】:

我正在尝试使用 disque 自动化来自名为 disque 的面向消息的中间件应用程序的一些调用,但我遇到了一些困难......

每次我希望客户端运行命令时,我必须期待它给出的提示并发送命令,但是当我尝试多次执行时,我遇到了问题。

这是最基本的非功能形式的期望脚本:

set timeout 20


spawn "./disque"

set timeout 10
expect  "127.0.0.1:7711> "  {send "ADDJOB scriptqueue body 0\r"}
set timeout 10
expect  "127.0.0.1:7711> "  {send "GETJOB FROM scriptqueue\r"}

但是,当我运行上述脚本时,只读取了第一个提示并发送了第一条消息。 GETJOB 命令永远不会运行。

这是我得到的输出:

spawn ./disque
127.0.0.1:7711> ADDJOB scriptqueue body 0

另外作为参考,当我在提示时手动输入这两个字符串时,disque 的正常工作方式如下:

127.0.0.1:7711> ADDJOB scriptqueue body 0
DI530404a85743c0afe1353ae1943df8d86c9f561005a0SQ
127.0.0.1:7711> GETJOB FROM scriptqueue
1) 1) "scriptqueue"
   2) "DI530404a806ff88886c366ba3566d7e36ea81f89605a0SQ"
   3) "body"
127.0.0.1:7711>

更新:

我刚刚在调试模式下使用 -d 运行脚本并得到以下输出:

expect version 5.45
argv[0] = expect  argv[1] = -d  argv[2] = cng4.sh
set argc 0
set argv0 "cng4.sh"
set argv ""
executing commands from command file cng4.sh
spawn ./disque
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {17657}

expect: does "" (spawn_id exp4) match glob pattern "*>"? no
127.0.0.1:7711>
expect: does "127.0.0.1:7711> " (spawn_id exp4) match glob pattern "*>"? yes
expect: set expect_out(0,string) "127.0.0.1:7711>"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "127.0.0.1:7711>"
send: sending "ADDJOB scriptqueue body 0\r" to { exp4 }

expect: does " " (spawn_id exp4) match glob pattern "*>"? no
127.0.0.1:7711> ADDJOB scriptqueue body 0
DI530404a8efd0d77b5bb62a7568510f7b6a29a13405a0SQ
127.0.0.1:7711>
expect: does " \r\u001b[0K127.0.0.1:7711> A\r\u001b[17C\r\u001b[0K127.0.0.1:7711> AD\r\u001b[18C\r\u001b[0K127.0.0.1:7711> ADD\r\u001b[19C\r\u001b[0K127.0.0.1:7711> ADDJ\r\u001b[20C\r\u001b[0K127.0.0.1:7711> ADDJO\r\u001b[21C\r\u001b[0K127.0.0.1:7711> ADDJOB\r\u001b[22C\r\u001b[0K127.0.0.1:7711> ADDJOB \r\u001b[23C\r\u001b[0K127.0.0.1:7711> ADDJOB s\r\u001b[24C\r\u001b[0K127.0.0.1:7711> ADDJOB sc\r\u001b[25C\r\u001b[0K127.0.0.1:7711> ADDJOB scr\r\u001b[26C\r\u001b[0K127.0.0.1:7711> ADDJOB scri\r\u001b[27C\r\u001b[0K127.0.0.1:7711> ADDJOB scrip\r\u001b[28C\r\u001b[0K127.0.0.1:7711> ADDJOB script\r\u001b[29C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptq\r\u001b[30C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqu\r\u001b[31C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptque\r\u001b[32C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueu\r\u001b[33C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue\r\u001b[34C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue \r\u001b[35C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue b\r\u001b[36C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue bo\r\u001b[37C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue bod\r\u001b[38C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body\r\u001b[39C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body \r\u001b[40C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body 0\r\u001b[41C\r\nDI530404a8efd0d77b5bb62a7568510f7b6a29a13405a0SQ\r\n127.0.0.1:7711> " (spawn_id exp4) match glob pattern "*>"? yes
expect: set expect_out(0,string) " \r\u001b[0K127.0.0.1:7711> A\r\u001b[17C\r\u001b[0K127.0.0.1:7711> AD\r\u001b[18C\r\u001b[0K127.0.0.1:7711> ADD\r\u001b[19C\r\u001b[0K127.0.0.1:7711> ADDJ\r\u001b[20C\r\u001b[0K127.0.0.1:7711> ADDJO\r\u001b[21C\r\u001b[0K127.0.0.1:7711> ADDJOB\r\u001b[22C\r\u001b[0K127.0.0.1:7711> ADDJOB \r\u001b[23C\r\u001b[0K127.0.0.1:7711> ADDJOB s\r\u001b[24C\r\u001b[0K127.0.0.1:7711> ADDJOB sc\r\u001b[25C\r\u001b[0K127.0.0.1:7711> ADDJOB scr\r\u001b[26C\r\u001b[0K127.0.0.1:7711> ADDJOB scri\r\u001b[27C\r\u001b[0K127.0.0.1:7711> ADDJOB scrip\r\u001b[28C\r\u001b[0K127.0.0.1:7711> ADDJOB script\r\u001b[29C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptq\r\u001b[30C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqu\r\u001b[31C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptque\r\u001b[32C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueu\r\u001b[33C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue\r\u001b[34C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue \r\u001b[35C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue b\r\u001b[36C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue bo\r\u001b[37C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue bod\r\u001b[38C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body\r\u001b[39C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body \r\u001b[40C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body 0\r\u001b[41C\r\nDI530404a8efd0d77b5bb62a7568510f7b6a29a13405a0SQ\r\n127.0.0.1:7711>"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " \r\u001b[0K127.0.0.1:7711> A\r\u001b[17C\r\u001b[0K127.0.0.1:7711> AD\r\u001b[18C\r\u001b[0K127.0.0.1:7711> ADD\r\u001b[19C\r\u001b[0K127.0.0.1:7711> ADDJ\r\u001b[20C\r\u001b[0K127.0.0.1:7711> ADDJO\r\u001b[21C\r\u001b[0K127.0.0.1:7711> ADDJOB\r\u001b[22C\r\u001b[0K127.0.0.1:7711> ADDJOB \r\u001b[23C\r\u001b[0K127.0.0.1:7711> ADDJOB s\r\u001b[24C\r\u001b[0K127.0.0.1:7711> ADDJOB sc\r\u001b[25C\r\u001b[0K127.0.0.1:7711> ADDJOB scr\r\u001b[26C\r\u001b[0K127.0.0.1:7711> ADDJOB scri\r\u001b[27C\r\u001b[0K127.0.0.1:7711> ADDJOB scrip\r\u001b[28C\r\u001b[0K127.0.0.1:7711> ADDJOB script\r\u001b[29C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptq\r\u001b[30C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqu\r\u001b[31C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptque\r\u001b[32C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueu\r\u001b[33C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue\r\u001b[34C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue \r\u001b[35C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue b\r\u001b[36C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue bo\r\u001b[37C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue bod\r\u001b[38C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body\r\u001b[39C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body \r\u001b[40C\r\u001b[0K127.0.0.1:7711> ADDJOB scriptqueue body 0\r\u001b[41C\r\nDI530404a8efd0d77b5bb62a7568510f7b6a29a13405a0SQ\r\n127.0.0.1:7711>"
send: sending "GETJOB FROM scriptqueue\r" to { exp4 }

看起来原因是它从磁盘应用程序本身获取了一些其他输出......我仍然不确定如何解决这个问题。

谢谢。

【问题讨论】:

    标签: bash automation expect disque


    【解决方案1】:

    从调试日志中可以看出,GETJOB 确实被发送到了应用程序。问题是您没有等待GETJOB 完成。试想当您手动与应用程序交互时,您如何知道GETJOB 已完成?你等待下一个提示,对吧?所以只需告诉expect 做同样的事情。也就是说,告诉expect 在继续(或退出)之前等待下一个提示。

    expect "127.0.0.1:7711> " {send "GETJOB FROM scriptqueue\r"}
    expect "127.0.0.1:7711> "
    

    【讨论】:

    • 那什么也没做。我得到了相同的输出和类似的调试视图:
    • 你能发布新的调试输出吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多