Nano Hash - криптовалюты, майнинг, программирование

Как определить, когда PTY.spawn завершился в скрипте ruby, чтобы затем запустить новый процесс

У меня есть сценарий Ruby, который порождает процесс и использует ожидание ожидания запроса на ввод, предоставление этого ввода, а затем, когда процесс завершен, для создания нового процесса.

Изначально проблема заключалась в том, что скрипт не ждал завершения первого процесса и выполнял следующую строку в скрипте.

Поэтому я добавил в скрипт Process.wait(pid), но теперь скрипт зависает в ожидании ввода на втором PTY.spawn в Process.wait(pid).

Я запускаю скрипт с Ruby 1.9.2, поскольку я знаю, что были некоторые проблемы с 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

Кто-нибудь знает, почему скрипт зависает на Process.wait(pid) на второй PTY.spawn?

06.12.2011

  • Всего лишь предположение, но может ли второй apt-get столкнуться с первым? Мне кажется, это не позволит вам делать два одновременно. 06.12.2011
  • Я думаю, что Process.wait(pid) для первого apt-get ждет, пока не завершится первый apt-get, прежде чем появится раздел do-end первого PTY.spawn. 07.12.2011

Ответы:


1

Чтобы помочь вам в отладке, я немного сократил код и создал более мягкую команду:

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.

06.12.2011
  • Железный Дровосек - Что ж, вы определенно указали мне правильное направление, как вы можете видеть в моем ответе ниже. Спасибо! 07.12.2011

  • 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
    
    07.12.2011
  • Попробуйте Regexp.escape('Do you want to continue [Y/n]?'), что приведет к Do\ you\ want\ to\ continue\ \[Y/n\]\?. Вероятно, вы могли бы просто сопоставить Regexp.escape('[Y/n]?'), который генерирует \[Y/n\]\?. Я склонен использовать Regexp.escape, когда мой шаблон приводит к большому количеству линейного шума от экранирования. Это предпочтение кодирования, связанное с обслуживанием. 07.12.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..