حسنًا ، حالياً الكمبيوتر كافٍ. يمكنك تحديد حدود زمنية للعمليات ، مع تحديد الحد الأقصى للوقت الذي يمكن تشغيله به باستخدام الامر timeout. إليك برنامج تعليمي لوضع قيود على تشغيل البرامج باستخدام هذا الأمر.
ماذا تفعل TimeOut بالنسبة لك؟
timeout هو أمر يسمح لك بتعيين حد على طول الفترة الزمنية سيتم تشغيل فيها البرنامج . ولكن لماذا تريد أن تفعل ذلك؟
إحدى الحالات هي عندما تعرف بالضبط المدة التي تريد أن تسير فيها العملية. تتمثل حالة الاستخدام الشائعة في timeout التحكم في برنامج تسجيل أو التقاط بيانات حتى لا تلتهم ملفات السجل مساحة القرص الثابت لديك .
حالة أخرى هي عندما لا تعرف المدة التي تريد أن تسير فيها العملية ، لكنك تعلم أنك لا تريد أن تستمر إلى أجل غير مسمى. قد يكون لديك عادة من تشغيل العمليات ، والتقليل من نوافذ الطرفية ، ونسيانها.
يمكن لبعض البرامج - حتى الأدوات البسيطة - توليد حركة مرور على الشبكة بمستويات يمكن أن تعوق أداء شبكتك. أو يمكنهم ربط الموارد على جهاز مستهدف ، مما يؤدي إلى إبطاء أدائه. ( ping، أنا أنظر إليك). ترك هذه الأنواع من البرامج التي تعمل لفترات طويلة وأنت بعيد عن جهاز الكمبيوتر الخاص بك هو ممارسة سيئة.
timeout هو جزء من GNU Core 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 ثانية timeout ينهي ping ونعود إلى موجه الأوامر.
استخدام timeout مع وحدات زمنية أخرى
لاحظ أنه لم يكن علينا إضافة "s" خلف الرقم 15. timeout يفترض أن القيمة بالثواني. يمكنك إضافة كلمة "s" ، لكنها في الحقيقة لا تحدث فرقًا.
لاستخدام قيمة زمنية مقاسة بالدقائق أو الساعات أو الأيام ، أضف "m" أو "h" أو "d".
لتشغيل برنامج ping لمدة ثلاث دقائق ، استخدم الأمر التالي:
timeout 3m ping 192.168.4.28
ping سوف يعمل لمدة ثلاث دقائق قبل timeout الخطوات في ويوقف ping الجلسة.
الحد من التقاط البيانات مع المهلة
يمكن أن تنمو بعض ملفات التقاط البيانات بسرعة كبيرة. لمنع مثل هذه الملفات من أن تصبح غير عملية أو حتى مشكلة في الحجم ، حدد مقدار الوقت المسموح به لتشغيل برنامج الالتقاط.
في هذا المثال، نستخدمه tcpdump، و التقاط حركة مرور بإستخدام أداة الشبكة . على أجهزة الاختبار التي تم البحث عنها في هذه المقالة ، tcpdump تم تثبيته بالفعل في نظامي Ubuntu Linux و Fedora Linux. كان لابد من تثبيته على Manjaro Linux و Arch Linux ، باستخدام الأمر التالي:
sudo pacman -Syu tcpdump
يمكننا تشغيله tcpdump لمدة 10 ثوانٍ باستخدام خياراته الافتراضية ، وإعادة توجيه الإخراج الخاص به إلى ملف يسمى capture.txt باستخدام الأمر التالي:
timeout 10 sudo tcpdump > capture.txt
( tcpdump له خياراته الخاصة لحفظ حركة مرور الشبكة الملتقطة في ملف. هذا اختراق سريع لأننا نناقش timeout، لا tcpdump.)
tcpdump يبدأ في التقاط حركة مرور الشبكة وننتظر 10 ثوانٍ. تأتي 10 ثوانٍ tcpdump وهي لا تزال قيد التشغيل ، وما زال حجم الالتقاط capt.txt يزداد. سيستغرق الأمرو وقت أضغط على Ctrl + C لتسريع أو للتوقف tcpdump.
التحقق من حجم capture.txt ls يظهر أنه ارتفع إلى 209K في غضون ثوانٍ. هذا الملف كان يكبر بسرعة!
ls -lh capture.txt
ماذا حدث؟ لماذا timeout لم يوقف tcpdump؟
الأمر كله يتعلق بالإشارات.
إرسال الإشارة الصحيحة
عندما يريد timeout إيقاف البرنامج ، فإنه يرسل إشارة SIGTERM . هذا بأدب يطلب البرنامج لإنهاء. قد تختار بعض البرامج تجاهل إشارة SIGTERM. عندما يحدث ذلك ، نحتاج إلى تقوية timeout قليلاً.
يمكننا القيام بذلك عن طريق طلب timeout إرسال إشارة SIGKILL بدلاً من ذلك.
لا يمكن "اكتشاف أو حظر أو تجاهل إشارة SIGKILL" - إنها دائمًا ما تمر عبرها. SIGKILL لا تطلب بأدب توقف البرنامج. يختبئ SIGKILL قاب قوسين أو أدنى مع ساعة توقيت وشق.
يمكننا استخدام -s كخيار (إشارة) لمعرفة timeout وإرسال إشارة SIGKILL.
timeout -s SIGKILL 10 sudo tcpdump > capture.txt
هذه المرة ، بمجرد مرور 10 ثوانٍ ، tcpdump يتم إيقافها.
السؤال بأدب أولاً
يمكننا أن نطلب من timeout محاولة إيقاف البرنامج باستخدام SIGTERM ، وإرسال SIGKILL فقط إذا لم تنجح SIGTERM.
للقيام بذلك ، نستخدم خيار -k (قتل بعدي). و -k يتطلب خيار قيمة الوقت كمعلمة.
في هذا الأمر ، نطلب timeout السماح لـ dmesg بتشغيل لمدة 30 ثانية ، ثم إنهائه بإشارة SIGTERM. إذا كان dmesg لا يزال قيد التشغيل بعد 40 ثانية ، فهذا يعني أنه تم تجاهل SIGTERM بدبلوماسية timeout ويجب إرسال SIGKILL لإنهاء المهمة.
dmesgهي أداة يمكن أن تراقب رسائل المخزن المؤقت لحلقة kernel وعرضها في نافذة طرفية.
timeout -k 40 30 dmseg -w
dmesg يعمل لمدة 30 ثانية ويتوقف عندما يتلقى إشارة SIGTERM.
نحن نعلم أنه لم يتم إيقاف dmesg SIGKILL لأن SIGKILL تترك دائمًا نعي من كلمة واحدة في النافذة الطرفية: "قتل". لم يحدث هذا في هذه الحالة.
استرجاع كود خروج البرنامج
البرامج سلوكه حسن نقوم بتمرير قيمة مرة أخرى إلى shell عندما يتم إنهاؤها. هذا هو المعروف باسم رمز الخروج. عادةً ما يتم استخدام هذا لإخبار shell - أو أي عملية أطلقت بواسطة البرنامج - ما إذا كان قد واجه البرنامج مشكلات أثناء تشغيله.
timeout يوفر رمز الخروج الخاص به ، لكننا قد لا نهتم بذلك. ربما نحن مهتمون أكثر برمز الخروج من العملية التي يتحكم بها timeout .
هذا الأمر يتيح لـ ping تشغيل لمدة خمس ثوان. تقوم باختبار اتصال جهاز كمبيوتر يسمى Nostromo ، وهو موجود على شبكة الاختبار التي تم استخدامها للبحث في هذه المقالة.
timeout 5 ping Nostromo.local
يعمل الأمر لمدة خمس ثوانٍ timeout وينهيها. يمكننا بعد ذلك التحقق من كود الخروج باستخدام هذا الأمر:
echo $?
رمز الخروج هو 124. هذه هي القيمة timeout المستخدمة للإشارة إلى أنه تم إنهاء البرنامج باستخدام SIGTERM. إذا أنهيت SIGKILL البرنامج ، فسيكون رمز الخروج هو 137.
إذا قاطعنا البرنامج باستخدام Ctrl + C ، فسيكون رمز الخروج من timeout صفر.
timeout 5 ping Nostromo.local
echo $?
إذا انتهى تنفيذ البرنامج قبل إنهاء timeout ، timeout يمكنه تمرير رمز الخروج من البرنامج مرة أخرى إلى shell.
لكي يحدث هذا ، يجب أن يتوقف البرنامج من تلقاء نفسه (بمعنى آخر ، لم يتم إنهائه بواسطة timeout) ، ويجب علينا استخدام خيار --preserve-status .
إذا استخدمنا -c كخيار (العد) بقيمة خمسة ، 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ه و كل شيء لتوفير بعض الحدود لتشغيل البرامج. إذا كان هناك خطر من أن ملفات السجل قد تتجاوز القرص الصلب الخاص بك أو أنك قد تنسى أنك تركت أداة شبكة قيد التشغيل ، فقم بتثبيتها ودع الكمبيوتر الخاص بك يخضع للتنظيم الذاتي timeout .