ruby - 如何确定 PTY.spawn 何时在 ruby​​ 脚本中完成,然后开始新进程

标签 ruby bash process expect pty

我有一个 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.spawnProcess.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/

相关文章:

linux - 如何将 echo 语句和 arp 语句的输出放在一行中?

c# - 如何清除另一个进程正在使用的文本文件

c# - 由特定进程按其名称加载的 DLL 列表

ruby - 将 `STDOUT` 和 `STDIN` 组合成一个 `IO` 对象

bash - 创建一个脚本,该脚本使用dd和netcat写入本地镜像文件以覆盖远程服务器上的硬盘驱动器

ruby - 获取对 ruby​​ 中封闭模块的引用

linux - 在制表符后插入文本

从 C 调用二进制文件(同时共享文件描述符)

ruby - 使用 `===`(包含运算符)比较类

ruby-on-rails - 缩短respond_with(:include => xxx)