كيفية استخدام أمر المهلة على Linux

حسنًا ، هذا وقت كافٍ لاستخدام الكمبيوتر. يمكنك تحديد حدود زمنية للعمليات ، وتحديد أقصى وقت يمكن تشغيله من أجله باستخدام أمر timeout. إليك برنامج تعليمي لوضع قيود على تشغيل البرامج باستخدام هذا الأمر.

ماذا تفعل Timeout بالنسبة لك؟

يسمح لك أمر المهلة ضع حدًا لطول الوقت سيتم تشغيل البرنامج لـ. ولكن لماذا تريد أن تفعل ذلك؟

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

هناك حالة أخرى عندما لا تعرف المدة التي تريد أن تستمر العملية فيها ، لكنك تعلم أنك لا تريدها أن تستمر إلى أجل غير مسمى. قد تكون معتادًا على تشغيل العمليات وتقليل نافذة المحطة الطرفية ونسيانها.

يمكن لبعض البرامج – حتى الأدوات المساعدة البسيطة – إنشاء حركة مرور على الشبكة بمستويات يمكن أن تعرقل أداء الشبكة. أو يمكنهم ربط الموارد على جهاز مستهدف ، مما يؤدي إلى إبطاء أدائه. (ping ، أنا أنظر إليك.) ترك هذه الأنواع من البرامج قيد التشغيل لفترات طويلة أثناء تواجدك بعيدًا عن الكمبيوتر يعد ممارسة سيئة.

timeout جزء من غنو كور Utils لذا فإن أنظمة التشغيل Linux و Unix مثل macOS جميعها بها مهلة مدمجة. لا يوجد شيء لتثبيته ؛ يمكنك استخدامه فور إخراجه من الصندوق.

الشروع في العمل مع انتهاء المهلة

هذا مثال بسيط. على سبيل المثال ، مع خيارات سطر الأوامر الافتراضية ، سيتم تشغيل الأمر ping حتى تقوم بإيقافه عن طريق الضغط على Ctrl + C. إذا لم تقاطعها ، فستستمر.

ping 192.168.4.28

باستخدام timeout ، يمكننا التأكد من عدم تشغيل ping وتشغيله ، ومضغ النطاق الترددي للشبكة وإزعاج أي جهاز يتم اختباره.

يستخدم هذا الأمر التالي timeout للحد الزمني ping. نحن نسمح ب 15 ثانية من وقت تشغيل ping.

timeout 15 ping 192.168.4.28

بعد 15 ثانية تنتهي المهلة من جلسة ping ويتم إرجاعنا إلى موجه سطر الأوامر.

  كيفية استخدام rclone للنسخ الاحتياطي إلى Google Drive على نظام Linux

استخدام timeout مع وحدات زمنية أخرى

لاحظ أنه لم يكن علينا إضافة “s” خلف 15. timeout يفترض أن القيمة بالثواني. يمكنك إضافة “s” ، لكنها حقًا لا تحدث فرقًا.

لاستخدام قيمة زمنية تُقاس بالدقائق أو الساعات أو الأيام ، أضف “m” أو “h” أو “d”.

لتشغيل برنامج ping لمدة ثلاث دقائق ، استخدم الأمر التالي:

timeout 3m ping 192.168.4.28

سيتم تشغيل ping لمدة ثلاث دقائق قبل دخول timeout وتوقف جلسة ping.

الحد من التقاط البيانات مع انتهاء المهلة

يمكن أن تنمو بعض ملفات التقاط البيانات بسرعة كبيرة. لمنع مثل هذه الملفات من أن تصبح غير عملية أو حتى مشكلة في الحجم ، حدد مقدار الوقت الذي يُسمح فيه بتشغيل برنامج الالتقاط.

في هذا المثال ، نستخدم tcpdump ، a التقاط حركة مرور الشبكة أداة. على أجهزة الاختبار التي تم البحث عنها في هذه المقالة ، تم تثبيت tcpdump بالفعل في Ubuntu Linux و Fedora Linux. يجب تثبيته على Manjaro Linux و Arch Linux ، باستخدام الأمر التالي:

sudo pacman -Syu tcpdump

يمكننا تشغيل tcpdump لمدة 10 ثوانٍ بخياراته الافتراضية ، وإعادة توجيه مخرجاته إلى ملف يسمى capture.txt بالأمر التالي:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump> capture.txt في نافذة طرفية “العرض =” 646 ″ الارتفاع = “77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (هذا) ؛ ”  onerror = ”this.onerror = null؛ pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this)؛”> </p>
<p> (يحتوي tcpdump على خياراته الخاصة لحفظ حركة مرور الشبكة الملتقطة إلى ملف. وهذا اختراق سريع لأننا ” إعادة مناقشة timeout ، وليس tcpdump.) </p>
<p> يبدأ tcpdump في التقاط حركة مرور الشبكة وننتظر لمدة 10 ثوانٍ.  وتأتي وتذهب 10 ثوانٍ ولا يزال tcpdump قيد التشغيل ، ولا يزال حجم ملف Capture.txt يتزايد.  سيستغرق الأمر Ctrl + C سريعًا لإيقاف تفريغ tcpdump. </p>
<p> يوضح التحقق من حجم ملف capture.txt باستخدام ls أنه نما إلى 209 آلاف في غضون ثوانٍ.  كان هذا الملف ينمو بسرعة! </ p> </p>
<pre> ls -lh capture.txt </pre>
<p> <img src =

ماذا حدث؟ لماذا لم توقف timeout tcpdump؟

كل شيء يتعلق بالإشارات.

إرسال الإشارة الصحيحة

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

يمكننا القيام بذلك عن طريق طلب timeout لإرسال إشارة SIGKILL بدلاً من ذلك.

  كيفية تصفية الضوء الأزرق في Linux باستخدام Redshift

لا يمكن “التقاط إشارة SIGKILL أو حظرها أو تجاهلها” – فهي تمر دائمًا. لا تطلب SIGKILL من البرنامج التوقف بأدب. SIGKILL تختبئ بالقرب من الزاوية بساعة توقيت وعلبة.

يمكننا استخدام الخيار -s (إشارة) لإخبار المهلة لإرسال إشارة SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump> capture.txt في نافذة طرفية “العرض =” 646 الارتفاع = “167 ″ عند التحميل =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (هذا) ؛ ”  onerror = ”this.onerror = null؛ pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this)؛”> </p>
<p> هذه المرة ، بمجرد انقضاء 10 ثوانٍ ، يتم إيقاف tcpdump. </p>
<p> < img src =

السؤال بأدب أولاً

يمكننا أن نطلب timeout لمحاولة إيقاف البرنامج باستخدام SIGTERM ، وإرسال SIGKILL فقط إذا لم يعمل SIGTERM.

للقيام بذلك ، نستخدم الخيار -k (kill after). يتطلب الخيار -k قيمة زمنية كمعامل.

في هذا الأمر ، نطلب timeout للسماح بتشغيل dmesg لمدة 30 ثانية ، ثم إنهائه بإشارة SIGTERM. إذا كان dmesg لا يزال قيد التشغيل بعد 40 ثانية ، فهذا يعني أنه تم تجاهل SIGTERM الدبلوماسي ويجب أن ترسل المهلة SIGKILL لإنهاء المهمة.

dmesg هو أداة يمكن أن مراقبة رسائل المخزن المؤقت لحلقة kernel وعرضها في نافذة طرفية.

timeout -k 40 30 dmseg -w

يعمل dmesg لمدة 30 ثانية ويتوقف عندما يتلقى إشارة SIGTERM.

نعلم أنه لم يكن SIGKILL هو الذي أوقف dmesg لأن SIGKILL يترك دائمًا نعيًا من كلمة واحدة في نافذة المحطة: “قتل”. لم يحدث ذلك في هذه الحالة.

استرداد كود الخروج من البرنامج

تعيد البرامج حسنة التصرف قيمة إلى الصدفة عندما تنتهي. يُعرف هذا باسم كود الخروج. عادةً ما يتم استخدام هذا لإخبار shell – أو أي عملية أطلقت البرنامج – ما إذا كان البرنامج قد واجه مشاكل أثناء تشغيله.

timeout يوفر كود الخروج الخاص به ، لكننا قد لا نهتم بذلك. ربما نكون مهتمين أكثر برمز الخروج من العملية التي تتحكم فيها timeout.

يتيح هذا الأمر تشغيل ping لمدة خمس ثوانٍ. إنه أمر ping على جهاز كمبيوتر يسمى Nostromo ، وهو موجود على شبكة الاختبار التي تم استخدامها للبحث في هذه المقالة.

timeout 5 ping Nostromo.local

يتم تشغيل الأمر لمدة خمس ثوانٍ وتنهيها timeout. يمكننا بعد ذلك التحقق من كود الخروج باستخدام هذا الأمر:

echo $?

رمز الخروج هو 124. هذه هي القيمة التي تستخدمها timeout للإشارة إلى إنهاء البرنامج باستخدام SIGTERM. إذا أنهى SIGKILL البرنامج ، فإن كود الخروج هو 137.

  كيف تلعب Psychonauts على Linux

إذا قاطعنا البرنامج باستخدام Ctrl + C ، فإن كود الخروج من timeout هو صفر.

timeout 5 ping Nostromo.local
echo $?

إذا انتهى تنفيذ البرنامج قبل إنهاء timeout ، يمكن لـ timeout تمرير رمز الخروج من البرنامج إلى الصدفة.

ولكي يحدث هذا ، يجب أن يتوقف البرنامج من تلقاء نفسه (بمعنى آخر ، لا يتم إنهاؤه بواسطة timeout) ، ويجب علينا استخدام خيار –preserve-status.

إذا استخدمنا الخيار -c (count) بقيمة خمسة ping ، فسيتم إيقاف تشغيل خمسة طلبات فقط. إذا أعطينا timeout مدة دقيقة واحدة ، فسينتهي الأمر ping من تلقاء نفسه بالتأكيد. يمكننا بعد ذلك التحقق من قيمة الخروج باستخدام echo.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

يكمل ping طلبات ping الخمسة وينتهي. كود الخروج هو صفر.

للتحقق من أن كود الخروج قادم من ping ، دعنا نفرض الأمر ping لإنشاء كود خروج مختلف. إذا حاولنا إرسال طلبات ping إلى عنوان IP غير موجود ، فسيفشل الأمر ping مع وجود رمز إنهاء خطأ. يمكننا بعد ذلك استخدام echo للتحقق من أن كود الخروج غير صفري.

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

من الواضح أن الأمر ping لا يمكنه الوصول إلى الجهاز غير الموجود ، لذلك يقوم بالإبلاغ عن الخطأ ويغلق. كود الخروج اثنان. هذا هو رمز الخروج الذي يستخدمه ping للأخطاء العامة.

وضع القواعد الأساسية

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