如何确定PTY.spawn何时在ruby脚本中完成,然后启动新进程

Jam*_*sta 1 ruby bash process expect pty

我有一个Ruby脚本,它生成一个进程并使用expect等待输入请求,提供该输入,然后在进程完成时,生成一个新进程.

最初的问题是脚本没有等待第一个进程完成,并执行脚本中的下一行.

所以我添加Process.wait(PID)的剧本,但现在的脚本挂起等待输入第二PTY.spawnProcess.wait(pid).

我正在使用Ruby 1.9.2运行脚本,因为我知道Ruby 1.8.7中存在一些问题PTY.spawn.

该脚本如下所示:

#!/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
Run Code Online (Sandbox Code Playgroud)

有谁知道脚本为什么会挂在Process.wait(pid)第二个PTY.spawn

the*_*Man 5

为了帮助您调试,我稍微减少了代码,并产生了一个更加良性的命令:

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
Run Code Online (Sandbox Code Playgroud)

这输出:

ruby test.rb 
1
2
Run Code Online (Sandbox Code Playgroud)

这对我来说意味着问题在于apt-get命令.