我有一个 Ruby 脚本,它生成一个进程并使用 expect 等待输入请求,提供该输入,然后在进程完成时生成一个新进程。
最初的问题是脚本没有等待第一个进程完成,而是执行了脚本中的下一行。
所以我在脚本中添加了 Process.wait(pid),但现在脚本挂起,等待第二个 PTY.spawn
上的输入,位于 Process.wait(pid)
。
我正在使用 Ruby 1.9.2 运行脚本,据我所知有 some problems with PTY.spawn
在 ruby 1.8.7 中。
脚本如下:
#!/usr/bin/env ruby
require 'pty'
require 'expect'
PTY.spawn(" apt-get install policycoreutils ") do |reader, writer, pid|
puts reader.expect(/Do you want to continue/)
writer.printf("Y\n")
Process.wait(pid)
end
PTY.spawn(" apt-get install libmagick9-dev ") do |reader, writer, pid|
puts reader.expect(/Do you want to continue/)
writer.printf("Y\n")
Process.wait(pid)
end
有谁知道为什么脚本在第二个 PTY.spawn
的 Process.wait(pid)
处挂起?
最佳答案
为了帮助您调试,我减少了一些代码,并产生了一个更良性的命令:
require 'pty'
require 'expect'
PTY.spawn("sleep 1;echo 1") do |reader, writer, pid|
puts reader.expect(/1/)
Process.wait(pid)
end
PTY.spawn("sleep 1;echo 2") do |reader, writer, pid|
puts reader.expect(/2/)
Process.wait(pid)
end
这个输出:
ruby test.rb
1
2
这对我来说意味着问题出在 apt-get
命令上。
关于ruby - 如何确定 PTY.spawn 何时在 ruby 脚本中完成,然后开始新进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405553/