2

プロセスを生成し、入力の要求を待機し、その入力を提供し、プロセスが終了すると、新しいプロセスを生成することを期待する Ruby スクリプトがあります。

最初の問題は、スクリプトが最初のプロセスが終了するのを待たず、スクリプトの次の行を実行することでした。

そのため、スクリプトに Process.wait(pid) を追加しましたが、スクリプトは 2 番目の入力を待ってハングPTY.spawnProcess.wait(pid)ます。

Ruby 1.8.7 で いくつかの問題PTY.spawnがあったことを知っているので、Ruby 1.9.2 でスクリプトを実行しています。

スクリプトは次のようになります。

#!/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

スクリプトがProcess.wait(pid)2 番目に停止する理由を知っている人はいますPTY.spawnか?

4

2 に答える 2

7

デバッグしやすいように、コードを少し減らして、より無害なコマンドを生成しました。

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コマンドにあることを意味します。

于 2011-12-06T23:44:21.973 に答える
3

実際、私は解決策を見つけました。それは非常に単純ですが、少し驚くべきものでした。2 番目の apt-get が実際に要求するのは、

 "Do you want to continue [Y/n]? "

起こっていたことは、この文字列の最初の部分で期待が一致し、文字列が完全に出力される前に「Y」を送信し、apt-get が「Y」を受け取る準備ができていなかったことだと思います。以下のコードのように、予期される一致を上記の文字列に変更すると、すべて正常に機能しました。

PTY.spawn(" apt-get install libmagick9-dev ") do |reader, writer, pid|
   puts reader.expect(/Do you want to continue \[Y\/n\]\? /)
   writer.printf("Y\n")
   Process.wait(pid)
 end
于 2011-12-07T00:00:21.820 に答える