إعادة توجيه المخرجات إلى ملف بدون تخزين مؤقت في لينكس
عند العمل مع البرمجة في البيئات المختلفة، قد يحتاج المبرمجون لإعادة توجيه الإخراج القياسي لبرامجهم إلى ملف، دون انتظار انتهاء البرنامج لضمان كتابة البيانات بشكل مستمر. هذه الحاجة في كثير من الأحيان تكون ملحة، خاصة في حالة طباعة البيانات بشكل دوري، مثل الحصول على سجلات أو نتائج عملية معينة في وقتها الفعلي. سنستعرض في هذا المقال كيفية تحقيق ذلك باستخدام نظام التشغيل لينكس.
أهمية توجيه الإخراج القياسي في لينكس
توجيه الإخراج القياسي إلى ملف يمثل إحدى الممارسات الشائعة في عالم البرمجة. يمكن أن يساعد ذلك في الحفاظ على السجلات بشكل منتظم وسهل الوصول إليه. ولكن، بعض البرامج قد تتطلب كتابة الإخراج بشكل فوري بدلًا من انتظار اكتمال العملية. في نظام لينكس، يوجد العديد من الطرق للقيام بذلك، وسنستعرض أبرزها في هذا المقال.
تحديات التخزين المؤقت
قد تلاحظ أن عند تشغيل برنامج Python، وبالتحديد سكريبتات التي تقوم بطباعة سطور متتالية، مثل السكريبت الذي يطبع 100 سطر بمعدل سطر كل ثانية، تكون المشكلة أن البيانات لا تكتب إلى الملف إلا بعد انتهاء البرنامج. هذا يحدث بسبب آلية التخزين المؤقت، حيث يتم تجميع البيانات في الذاكرة بدلاً من كتابتها مباشرة إلى الإخراج المخصص.
الحلول المتاحة لتجاوز التخزين المؤقت
هناك عدة طرق لتجاوز هذه المشكلة. فيما يلي بعض الخيارات الفعالة لإعادة توجيه الإخراج القياسي إلى ملف دون تخزين مؤقت:
-
استخدام الأمر
stdbuf
: يمكنك استخدام هذا الأمر لتعديل كيفية تخزين الإخراج. عن طريق استخدام الخيار-oL
, يمكنك الحصول على إخراج غير مخزن مؤقتًا. تتضمن طريقة الاستخدام:stdbuf -oL python3 test.py > log.txt
-
استخدام الأداة
unbuffer
: تعدunbuffer
جزءًا من حزمةexpect
. يمكنك استخدامه لتشغيل السكريبت الخاص بك كما يلي:unbuffer python3 test.py > log.txt
-
أداة
script
: توفر لك أداةscript
إمكانية تسجيل الجلسة في ملف. يمكنك استخدامها كالتالي:script -c "python3 test.py" log.txt
كل هذه الخيارات تهدف إلى تمكين المدخلات والمخرجات الواردة في السكريبت الخاص بك من الكتابة بشكل فوري إلى الملف، مما يضمن تحديث السجل بشكل مستمر.
تعديل السكريبت للكتابة بشكل مباشر
كخيار إضافي، يمكنك تعديل السكريبت نفسه للاستغناء عن التخزين المؤقت. بالاعتماد على ما يلي:
import sys
import time
# لتجنب تخزين مؤقت
sys.stdout.flush()
for i in range(100):
print(f'line {i}')
sys.stdout.flush() # تأكد من تفريغ الإخراج
time.sleep(1)
تأكد من استدعاء sys.stdout.flush()
بعد كل طباعة، وهذا سيساعد في ضمان أن يتم إخراج كل سطر بشكل فوري.
الخاتمة
توجيه الإخراج القياسي إلى ملف دون التخزين المؤقت هو أمر ضروري في العديد من السيناريوهات في البرمجة، خاصة عند التعامل مع المعلومات التي يجب تسجيلها في الوقت الفعلي. من خلال استخدام أساليب مثل stdbuf
وunbuffer
أو تعديل السكريبت، يمكنك جعل عملية الكتابة إلى الملفات أكثر سلاسة وفعالية. باتباع الخطوات المذكورة أعلاه، يمكنك التأكد من أن كل سطر يُكتب في الملف مباشرة أثناء تنفيذ البرنامج.