بعض الأوامر تعلق تطبيق ويب Ruby الخاص بي
-
23-09-2019 - |
سؤال
ألعب مع 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 ...