دليل شامل لأمر lsof في لينكس - نصائح عملية أساسية من تعارض المنافذ إلى تحرير مساحة الملفات المحذوفة

نظرة عامة

يمكن حل مشكلات مثل “تعارض المنافذ” أو “عدم انخفاض مساحة القرص حتى بعد حذف الملفات” التي تحدث أثناء إدارة أنظمة لينكس على الفور باستخدام الأمر lsof. في هذا المقال، سنتعرف على التقنيات الأساسية لتطبيق lsof عملياً في بيئة لينكس التي تعامل كل شيء كملف. سنستعرض خطوة بخطوة خبرات استكشاف الأخطاء وإصلاحها الأساسية لمهندسي الأنظمة، بدءاً من تتبع المنافذ وحتى تحرير أقفال الملفات.

الفحص الأساسي لأمر lsof والتحقق من الملفات المفتوحة لمستخدم أو عملية معينة

للتحقق مما إذا كان الأمر lsof مثبتاً على النظام، وتثبيت الحزمة في حال لم تكن مثبتة، قم بتشغيل الأمر command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof).

command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof)

للتحقق من الإصدار المثبت ومعلومات البناء للأمر lsof، قم بتشغيل الأمر lsof -v.
⚙️ [الخيارات الرئيسية]

-u : يعرض قائمة بالملفات والعمليات المفتوحة بواسطة حساب مستخدم محدد.
-c : يصفي قائمة الملفات المفتوحة بواسطة العمليات التي تبدأ باسم العملية المحدد.
-p : يتحقق من قائمة الملفات المفتوحة بواسطة معرف عملية محدد (PID).
-i : يستعلم عن مآخذ الشبكة والعمليات التي تستخدم منافذ معينة.
+D : يبحث بشكل متكرر (تكراري) عن قائمة الملفات المفتوحة في الدليل المحدد ومساراته الفرعية.
-t : يخرج فقط معرفات العمليات (PID) بإيجاز سطراً بسطر، مما يجعله مفيداً لدمجه في البرامج النصية (السكربتات).

lsof -v

لإعداد دليل اختبار وملف تجريبي للتطبيق العملي على lsof، قم بتشغيل الأمر mkdir -p /tmp/lsof_lab && echo '테스트 파일 내용' > /tmp/lsof_lab/sample.txt.

mkdir -p /tmp/lsof_lab && echo ‘테스트 파일 내용’ > /tmp/lsof_lab/sample.txt

لتتبع الملف التجريبي الذي تم إنشاؤه في الخلفية بحيث تظل العملية فاتحةً له باستمرار، قم بتشغيل الأمر tail -f /tmp/lsof_lab/sample.txt &.

tail -f /tmp/lsof_lab/sample.txt &

يعرض الأمر lsof -u $(whoami) | head -n 15 أول 15 سطراً من قائمة الملفات التي تشغلها العمليات التي يقوم بتشغيلها المستخدم المسجل دخوله حالياً.
يمكنك التحقق من تفاصيل الملفات المفتوحة بواسطة الحساب الحالي، مثل مكتبات النظام الأساسية والملفات التنفيذية.

lsof -u $(whoami) | head -n 15

يبحث الأمر lsof -c tail ويعرض قائمة الملفات والمكتبات المفتوحة بواسطة العمليات التي تحمل اسم tail.
يتيح لك ذلك التحقق من واصفات الملفات والمكتبات المشتركة التي يشير إليها الأمر tail قيد التشغيل في الخلفية.

lsof -c tail

بعد الانتهاء من التدريب، قم بتشغيل الأمر killall tail 2>/dev/null || true لإنهاء عملية tail قيد التشغيل في الخلفية بأمان وتنظيفها.

killall tail 2>/dev/null || true

فحص منافذ الشبكة واستكشاف أخطاء تعارض العمليات وإصلاحها

لإعداد بيئة تدريبية لفحص المنافذ وتعارض العمليات، تحقق مما إذا كان python3 مثبتاً على النظام، وقم بتثبيت الحزمة إذا لم تكن مثبتة.

command -v python3 >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y python3)

لاختبار حجز منافذ الشبكة، قم بتشغيل خادم ويب بسيط على المنفذ 8080 في الخلفية.

python3 -m http.server 8080 >/dev/null 2>&1 &

انتظر لمدة ثانية واحدة حتى ترتبط عملية خادم الويب قيد التشغيل في الخلفية بالمنفذ 8080 بشكل صحيح.

sleep 1

يستعلم الأمر lsof -i :8080 عن العملية التي تستخدم المنفذ 8080.
من خلال النتائج، يمكنك التأكد من أن عملية python3 ذات المعرف PID 371 في حالة انتظار LISTEN على المنفذ 8080.

lsof -i :8080

يعرض الأمر lsof -i -P -n | head -n 15 قائمة مآخذ الشبكة في النظام بسرعة بصيغة أرقام دون تحويل أرقام المنافذ وعناوين IP إلى أسماء.
نظراً لتجاوز البحث العكسي لـ DNS وتعيين أسماء منافذ الخدمة، يمكنك فهم حالة إشغال المنافذ بسرعة ودون أي تأخير.

lsof -i -P -n | head -n 15

يقوم الأمر lsof -i TCP:8080 -sTCP:LISTEN بتصفية وعرض الاتصالات على المنفذ 8080 التي تستخدم بروتوكول TCP وفي حالة LISTEN بدقة فقط.
هذا مفيد عند استبعاد جلسات الاتصال غير الضرورية وتحديد عمليات الخدمات الخلفية (daemons) التي تنتظر الاتصالات على هذا المنفذ بدقة.

lsof -i TCP:8080 -sTCP:LISTEN

بعد الانتهاء من التدريب، قم بإنهاء عملية خادم الويب في الخلفية التي كانت تشغل منفذ TCP رقم 8080 قسراً لتنظيف الموارد المحجوزة.

fuser -k 8080/tcp 2>/dev/null || kill $(lsof -t -i :8080) 2>/dev/null || true

تتبع دليل معين والملفات التي تعيق إلغاء التثبيت (Device Busy)

لإعادة إنشاء موقف إشغال الدليل وإعاقة إلغاء التثبيت، قم بإنشاء دليل للتدريب وانتقل إلى هذا المسار.

mkdir -p /tmp/mount_test && cd /tmp/mount_test

لإنشاء ملف سجل مستهدف لتقوم العملية بقراءته، شغّل الأمر echo '작업 중인 파일' > active_work.log.

echo ‘작업 중인 파일’ > active_work.log

قم بتشغيل عملية sleep في الخلفية لتشير إلى الملف المنشأ عبر الإدخال القياسي وتشغله باستمرار.

sleep 30 < active_work.log &

للتحقق من الحالة من خارج الدليل المحجوز، قم بتغيير مسار العمل إلى الدليل الرئيسي (home).

cd /root || cd ~

يتتبع الأمر lsof +D /tmp/mount_test جميع الملفات والعمليات المفتوحة بشكل تكراري في الدليل المحدد ومساراته الفرعية ويعرضها.
من خلال النتائج، يمكنك التأكد من أن عملية sleep ذات المعرف PID 450 تشير إلى هذا الدليل كدليل العمل الحالي (cwd)، وفاتحة للملف active_work.log في وضع القراءة (0r)، وهو ما يمثل السبب في إعاقة إلغاء التثبيت.

lsof +D /tmp/mount_test

بعد الانتهاء من التدريب، أنهِ عملية sleep في الخلفية التي كانت تشغل الدليل والملف بأمان.

killall sleep 2>/dev/null || true

احذف الدليل المؤقت للاختبار والملفات الفرعية المستخدمة في التدريب لتنظيف موارد النظام.

rm -rf /tmp/mount_test

استعادة وتنظيف الملفات الشبحية المحذوفة التي ما زالت تشغل مساحة القرص (deleted)

لاختبار تسرب مساحة القرص، أنشئ دليلاً للاختبار وأنشئ ملف اختبار كبيراً بحجم 10 ميغابايت.

mkdir -p /tmp/leak_test && dd if=/dev/zero of=/tmp/leak_test/large.img bs=1M count=10 >/dev/null 2>&1

تتبع في الخلفية بحيث تحتفظ العملية بمقبض الملف الكبير الذي تم إنشاؤه.

tail -f /tmp/leak_test/large.img &

احذف الملف الكبير المحجوز قسراً من نظام الملفات لإعادة تمثيل حالة تسرب الملفات الشبحية.

rm -f /tmp/leak_test/large.img

يستعلم الأمر lsof | grep '(deleted)' | head -n 5 عن قائمة الملفات التي تم حذفها من نظام الملفات ولكن لا تزال العملية تبقيها مفتوحة وتشغل مساحة من القرص.
يتيح لك ذلك تتبع الملفات الشبحية التي لم يتم استرجاع مساحة القرص الخاصة بها رغم حذفها بأمر rm والعمليات المرتبطة بها بسرعة.

lsof | grep ‘(deleted)’ | head -n 5

استناداً إلى معرف العملية المستخرج عبر lsof -t، استعلم عن قائمة واصفات الملفات في الدليل /proc/$TARGET_PID/fd/.
من خلال التحقق المباشر من رقم واصف الملف الذي تشير إليه العملية، يمكنك تفريغ المساحة دون إعادة تشغيل العملية، أو استعادة البيانات الأصلية المحذوفة عبر واصف الملف هذا إذا لزم الأمر.

TARGET_PID=$(lsof -t /tmp/leak_test/large.img 2>/dev/null | head -n 1) && [ -n “$TARGET_PID” ] && ls -l /proc/$TARGET_PID/fd/ || true

بعد الانتهاء من التدريب، أنهِ العملية قيد التشغيل في الخلفية التي واصلت حجز الملف الشبحي بأمان لاستعادة مساحة القرص بالكامل.

killall tail 2>/dev/null || true

احذف الدليل المؤقت للاختبار بالكامل لتنظيف موارد النظام.

rm -rf /tmp/leak_test

حتى الآن، استعرضنا بإيجاز النصائح العملية الأساسية بدءاً من حل تعارض المنافذ وحتى استعادة مساحة القرص من الملفات المحذوفة باستخدام الأمر lsof.
نأمل أن تساعدك المعلومات الواردة هنا في حل المشكلات أثناء إدارة الخوادم واستكشاف الأخطاء وإصلاحها عملياً.