【发布时间】:2013-07-28 18:43:53
【问题描述】:
我正在使用 expect 在我的服务器上启动一个应用程序:
#!/usr/bin/expect
set timeout -1
spawn "bin/start-all.sh"
expect {
-re "Found MongoDB in" { send "y\r"; exp_continue }
-re "Found Hadoop in" { send "y\r"; exp_continue }
-re "Going to start Hadoop" { interact }
}
脚本运行时,我可以在几秒钟内访问服务器上的应用程序,但一旦结束,应用程序就变得不可用。
我在调试模式下运行了 expect 并在最后得到以下输出:
expect: does "vendors area. Do you want to start it? [y/n] y\r\n" (spawn_id exp6) match regular expression "Found MongoDB in"? Gate "Found MongoDB in"? gate=no
"Found Hadoop in "? Gate "Found Hadoop in "? gate=no
"Going to start Hadoop"? Gate "Going to start Hadoop"? gate=no
Going to start Hadoop...
expect: does "vendors area. Do you want to start it? [y/n] y\r\nGoing to start Hadoop...\r\n" (spawn_id exp6) match regular expression "Found MongoDB in"? Gate "Found MongoDB in"? gate=no
"Found Hadoop in "? Gate "Found Hadoop in "? gate=no
"Going to start Hadoop"? Gate "Going to start Hadoop"? gate=yes re=yes
expect: set expect_out(0,string) "Going to start Hadoop"
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "vendors area. Do you want to start it? [y/n] y\r\nGoing to start Hadoop"
tty_raw_noecho: was raw = 0 echo = 1
interact: received eof from spawn_id exp6
tty_set: raw = 0, echo = 1
tty_set: raw = 5, echo = 0
我尝试在最后一种模式下使用exit 0、interact、exp_continue、disconnect、sleep 10,以及期待eof,但似乎没有任何效果。我也尝试过运行expect start-all.exp &,但这也不起作用。
当我手动运行 bin/start-all.sh 时,脚本会启动必要的进程然后退出。然而,期望这些进程似乎被杀死了。我该如何解决这个问题?
【问题讨论】:
-
有很多细节,但不清楚你想要达到什么目的。
-
这是一个很长的镜头,但你有没有在最后尝试
expect eof? -
恐怕我对这个start-all.sh脚本不熟悉。在 Expect 的 PTY 中运行时,它可能会做一些奇怪的事情,导致它过早终止。
-
有什么解决办法吗?我有同样的问题:尝试与生成的进程交互,当它到达某个点时,将其背景化并退出。我还在期望脚本中尝试了
expect_background和exit 0,但没有一个让父期望脚本结束/退出。只有一个中断(CTRL-C)结束它,但我担心它也会中断生成的进程(我不想发生这种情况)。 -
@Lucas,看起来下面的答案已经帮助了几个人。它解决了你的问题吗?如果是,你能接受吗?
标签: shell unix tcl background-process expect