Freebsd، Mysql، Perl، Bash: Intermittent حظر على الأنابيب المسماة؟

StackOverflow https://stackoverflow.com/questions/1653455

سؤال

هذا غريب ولست متأكدا من هو الجاني حقا.

أقوم ببعض البرمجة النصية، على FreeBSD (6.2)؟ مما يجعل الاستخدام المكثف لما يلي *** باش *** ISM:

do_something <(mysql --skip-column-names -B -e 'select ... from ... where ...;')

... حيث "do_something هو أداة فائدة Crufty إلى حد ما (في بيرل) لن يقرأ من خط أنابيب. إذا كنت تستخدم ملف منتظم يعمل بشكل جيد. سحق البرنامج النصي باستخدام أشياء مثل exec 4< <(...) مع هذه الأنواع من الاستعلامات (التالية بواسطة حلقات النموذج while read x y z <&4; do ... لا يبدو أن لديها أي مشاكل.

ومع ذلك، يبدو أن Perl (5.8.x) من كتلة دوريا (على ما يبدو إلى الأبد). حاولت تغيير chomp(my $data = <MYDATA>); مع روتين يستخدم Sysread. وكتبت بعض حالات الاختبار في بيثون للمقارنة. يبدو أن هذه حظرها أقل بكثير من رمز بيرل الاصطلاح، لكنها لا تزال تفعل ذلك في بعض الأحيان. (رمز بيثون باستخدام f.read() أو os.read(f.fileno()...) يبدو أن تتصرف بنفس القدر في هذه المشكلة).

لقد حاولت إعادة إنتاج المشكلة باستخدام ... <(cat ...) (أينما كنت قطةجي الملف العادي) وهذا يبدو أبدا إعادة إنتاج أن كشك.

لقد نظرت في بعض كتراس / kdump. البيانات ... ولكن أنا أكثر دراية مع لينكس سترض أو حتى سولاريس تروس ... لذلك أنا لم أحسب ما يحدث من هناك حتى الآن، سواء.

أفترض أننا يمكن أن يستبعد في الغالب بيرل، لأنني مستنسخ نفس المشكلة باستخدام بيثون ... لا أرى كيف سحق يمكن أن تفعل أي شيء خاطئ هنا (فقط إنشاء أنبوب مسمى في / var / tmp / sh-np-xxx والأسلاك العمليات حتى ذلك).

ماذا يمكن أن mysql. شل / فائدة تفعل ذلك قد يسبب هذا؟ لا أعتقد أنني رأيتها من أي شيء آخر (مثل قطة أو د). لم أختبر هذا السيناريو تحت Linux ... لكنني استخدمت <(...) (استبدال العملية) لسنوات تحت لينكس ولا تتذكر من أي وقت مضى رؤية هذا.

هل هي مشكلة FreeBSD؟

تأكد من أنني أستطيع أن أعمل حول المشكلة باستخدام ملفات مؤقتة ... لكنني متأكد من فهم سبب القيام بذلك (وتجنب بعض السباقات وتنظيف الفوضى التي تنطوي عليها الملفات المؤقتة).

أي اقتراحات؟

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

المحلول

الفرق الكبير بين العمل على إخراج MySQL ويقوم مباشرة على الملف هو توقيت. عندما يتم إيقاف عملية بيرل، فإن السؤال الكبير هو: "لماذا لا يجعل التقدم إلى الأمام"؟ يمكنك استخدام خيار "L" ل PS لرؤية قناة الانتظار لعملية بيرل؛ وبهذه الطريقة يمكنك أن ترى ما إذا كانت محظورة في قراءة، أو إذا كان هناك شيء آخر يحدث. إذا تم حظره بالفعل على إدخال الأنابيب، فأنا أتوقع أن يكون إدخال Mwchan ل Perl "piperd".

ستكون نفس المعلومات مثيرة للاهتمام لعملية MySQL.

كيف يبدو رمز اختبار ثعبان الخاص بك؟

طريقة أخرى لكتابة هذا مع تجنب الشدق هذا؛ من شأنه أن يسمح لك باستبعد باش:

mysql --skip-column-names -B -e 'select ... from ... where ...;' | do_something /dev/stdin

أسئلة أخرى مثيرة للاهتمام:

  • هل يتغير الخيار المنقدر إلى MySQL أي شيء؟

  • هل أنابيب الإخراج MySQL من خلال DD تغيير أي شيء؟ (على سبيل المثال. "perlscript <(mysql ... | DD)

ملخص: بحاجة إلى مزيد من المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top