期待不等待催生的过程

时间:2016-05-09 20:24:24

标签: expect

我正在尝试编写expect脚本来启动SSH隧道,等待隧道进程关闭(抛出错误),然后重新运行隧道命令。 (值得注意的是autossh和其他自动隧道解决方案在这里并不相关,因为我正在尝试做的事情涉及expect。)这是包含故障排除消息的完整脚本。

#!/usr/bin/expect

set timeout 1

while { $timeout == 1 } {
  spawn -noecho ssh -f -N -T -R22224:localhost:22223 username@xxx.xxx.xxx.xxx
  send_user "Looking for host"
  set timeout 0
  wait
  set timeout 1
  send_user "We've encountered an error. Re-running."
}

send_user "Out of the loop."

ssh命令有效,而expect man page表示wait应保留脚本,直到当前生成的进程终止,但它没有,它最终重新运行循环a一大堆时间(迫使我在远程机器上pkill多个sshd个实例。我已经尝试了wait spawnwait spawn_idexpect {ssh*}(根据手册页,也应该让脚本等待),但没有任何东西会让脚本暂停。

1 个答案:

答案 0 :(得分:1)

ssh -f将分叉子进程(在后台运行),父进程只是退出。 Expect的wait命令只等待spawn父进程,因此wait很快就会返回。