سؤال

ألعب مع Rails & Sinatra ، وأريد تنفيذ الأوامر على الخادم. يتم إدخال تلك الأوامر من نموذج. الشيء هو ، إذا أدخلت أمر يتوقع إدخال ، فإن تطبيقي كله معلق. إليك الرمز الذي أستخدمه لتنفيذها:

@threads << Thread.new do
    Thread.current["buffer"] = ""
    puts "starting #{params[:command]}"
    IO.popen(params[:command]) do |io|
        io.each_line {|l| Thread.current["buffer"] += l}
    end
end

هذا يعمل بشكل جيد لأوامر بسيطة مثل ls ... ولكن على سبيل المثال إذا أدخلت pause مما يتوقع من المستخدم أن يضغط على مفتاح للمتابعة ، كل شيء معلق. كيف يمكنني الالتفاف على ذلك؟

تحرير: لقد تذكرت للتو طلبت العام الماضي عن سلوك روبي الخيط هنا: لماذا لا يشبه هذا الأمر مثل الخيوط؟ . حاولت تشغيل سيناترا باستخدام مترجم 1.9.1 وعمل. أقل من 1.8.6 لا. يمكن للوزارة أن يغلق هذا السؤال إذا كان يريد.

هل كانت مفيدة؟

المحلول 2

الحل: لقد تذكرت للتو أنني سألت العام الماضي عن سلوك رواق روبي هنا: لماذا لا يشبه هذا الأمر مثل الخيوط؟ . حاولت تشغيل سيناترا باستخدام مترجم 1.9.1 وعمل. أقل من 1.8.6 لا.

نصائح أخرى

جرب الأنابيب /dev /null في عملية طفلك:

IO.popen("#{params[:command]} </dev/null") do ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top