الفرق بين المراجعتين لصفحة: «Bash/signals»

من موسوعة حسوب
إضافة 1.0: عنوان الصفحة
مراجعة 6: إضافة تصانيف
 
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الإشارات في Bash}}</noinclude>
<noinclude>{{DISPLAYTITLE:الإشارات في Bash}}</noinclude>
== صفحة man للإشارات ==
== صفحة man للإشارات ==
يحتوي نظامك على صفحة man بها كل الإشارات المتاحة، لكن قد يُفتح بطريقة مختلفة اعتمادًا على نظام تشغيلك، والطريقة التي ستجدها في أغلب أنظمة لينكس هي man 7 signal، لكن إن كنت في ريب من الأمر فحدد صفحة man والقسم الذي تريده بالضبط باستخدام أوامر مثل:<syntaxhighlight lang="bash">
يحتوي نظامك على صفحة <code>man</code> بها كل الإشارات المتاحة، لكن قد يُفتح بطريقة مختلفة اعتمادًا على نظام تشغيلك، والطريقة التي ستجدها في أغلب أنظمة لينكس هي man 7 signal، لكن إن كنت في ريب من الأمر فحدد صفحة <code>man</code> والقسم الذي تريده بالضبط باستخدام أوامر مثل:<syntaxhighlight lang="bash">
man -k signal | grep list
man -k signal | grep list
</syntaxhighlight>أو<syntaxhighlight lang="bash">
</syntaxhighlight>أو<syntaxhighlight lang="bash">
apropos signal | grep list
apropos signal | grep list
</syntaxhighlight>ستجد أسماء الإشارات باستخدام <code>kill -l</code>.
</syntaxhighlight>ستجد أسماء الإشارات باستخدام <code>kill -l</code>.
== الإشارات إلى صدفة Bash الخاصة بك ==
== الإشارات إلى صدفة Bash الخاصة بك ==
تتجاهل صدفة bash التفاعلية إشارتي <code>SIGTERM</code> و <code>SIGQUIT</code> في غياب الأفخاخ (Traps)، وتُلتقط <code>SIGINT</code> ويُتعامل معها، ويتم تجاهل كل من <code>SIGTTIN</code> و <code>SIGTTOU</code> و <code>SIGTSTP</code> إن كان التحكم في الوظائف (job control) نشطًا. وكذلك فإن الأوامر التي تُشغَّل كنتيجة لاستبدال الأوامر (command substitution) تتجاهل أيضًا تلك الإشارات حين تولَّد عن طريق لوحة المفاتيح.
تتجاهل صدفة bash التفاعلية إشارتي <code>SIGTERM</code> و <code>SIGQUIT</code> في غياب الأفخاخ (Traps)، وتُلتقط <code>SIGINT</code> ويُتعامل معها، ويتم تجاهل كل من <code>SIGTTIN</code> و <code>SIGTTOU</code> و <code>SIGTSTP</code> إن كان التحكم في الوظائف (job control) نشطًا. وكذلك فإن الأوامر التي تُشغَّل كنتيجة لاستبدال الأوامر (command substitution) تتجاهل أيضًا تلك الإشارات حين تولَّد عن طريق لوحة المفاتيح.
سطر 13: سطر 12:


استخدم خيار <code>huponexit</code> لقتل كل الوظائف عند استقبال إشارة <code>SIGHUP</code> باستخدام أمر <code>shopt</code>.
استخدم خيار <code>huponexit</code> لقتل كل الوظائف عند استقبال إشارة <code>SIGHUP</code> باستخدام أمر <code>shopt</code>.
== إرسال الإشارات باستخدام الصدفة ==
== إرسال الإشارات باستخدام الصدفة ==
يمكن إرسال الإشارات التالية باستخدام صدفة bash:
يمكن إرسال الإشارات التالية باستخدام صدفة bash:
سطر 31: سطر 29:
|إشارة الإيقاف، ترسل <code>SIGTSTP</code> إلى برنامج ما لإيقافه ومن ثَم إعادة التحكم إلى الصدفة.
|إشارة الإيقاف، ترسل <code>SIGTSTP</code> إلى برنامج ما لإيقافه ومن ثَم إعادة التحكم إلى الصدفة.
|}
|}
<blockquote>'''إعدادات الطرفية'''</blockquote><blockquote>تفقد إعدادات stty لديك، إذ أن إيقاف وإعادة التشغيل لخرج ما تكون عادة معطلة إن كنت تستخدم محاكيات طرفية حديثة، أما xterm فتدعم ctrl+s و ctrl+q افتراضيًا</blockquote>
<blockquote>'''إعدادات الطرفية'''</blockquote><blockquote>تفقَّد إعدادات stty لديك إذ أن إيقاف وإعادة التشغيل لخرج ما تكون عادة معطلة إن كنت تستخدم محاكيات طرفية حديثة، أما xterm فتدعم ctrl+s و ctrl+q افتراضيًا</blockquote>
 
== استخدام الإشارات مع kill ==
== استخدام الإشارات مع kill ==
تحتوي أغلب الصدفات الحديثة -بما فيها bash- على أمر <code>kill</code> مضمَّن، وتقبل bash الأسماء والأرقام كخيارات، وكذلك مسموح أن تكون الوسائط معرفات للوظائف أو العمليات. ويمكن إرسال تقرير بحالة خروج باستخدام الخيار <code>l-</code> بحيث يعطي صفرًا في حالة نجاح إرسال إشارة واحدة على الأقل، وقيمة غير صفرية في حالة الأخطاء.
تحتوي أغلب الصدفات الحديثة -بما فيها bash- على أمر <code>kill</code> مضمَّن، وتقبل bash الأسماء والأرقام كخيارات، وكذلك مسموح أن تكون الوسائط معرفات للوظائف أو العمليات. ويمكن إرسال تقرير بحالة خروج باستخدام الخيار <code>l-</code> بحيث يعطي صفرًا في حالة نجاح إرسال إشارة واحدة على الأقل، وقيمة غير صفرية في حالة الأخطاء.
سطر 66: سطر 63:
|إيقاف العملية (stop)
|إيقاف العملية (stop)
|}
|}
<blockquote><code>SIGKILL</code> و <code>SIGSTOP</code></blockquote><blockquote>لا يمكن التقاط أو حجب أو تجاهل <code>SIGKILL</code> أو <code>SIGSTOP</code>.</blockquote>حين تريد قتل عملية أو سلسلة عمليات فمن المنطقي أن تبدأ بإشارة <code>SIGTERM</code> لأنها الإشارة الأقل خطورة وأثرًا، فبتلك الطريقة تحظى البرامج التي صُممت لتتبع إجراءات مرتبة للإغلاق بفرصة لاتباع تلك الإجراءات التي صُمِّمَت لتنفذها حين تستلم إشارة <code>SIGTERM</code>، مثل عمليات التنظيف والمسح (cleaning up) وإغلاق الملفات المفتوحة.
<blockquote>'''<code>SIGKILL</code> و <code>SIGSTOP</code>'''</blockquote><blockquote>لا يمكن التقاط أو حجب أو تجاهل <code>SIGKILL</code> أو <code>SIGSTOP</code>.</blockquote>حين تريد قتل عملية أو سلسلة عمليات فمن المنطقي أن تبدأ بإشارة <code>SIGTERM</code> لأنها الإشارة الأقل خطورة وأثرًا، فبتلك الطريقة تحظى البرامج التي صُممت لتتبع إجراءات مرتبة للإغلاق بفرصة لاتباع تلك الإجراءات التي صُمِّمَت لتنفذها حين تستلم إشارة <code>SIGTERM</code>، مثل عمليات التنظيف والمسح (cleaning up) وإغلاق الملفات المفتوحة.


أما إن أرسلت إشارة <code>SIGKILL</code> إلى عملية فإنك تلغي أي فرصة لها في تنفيذ تنظيف وإغلاق منظم مما قد يُحدث عواقب مؤسفة. لكن لو لم تنجح عملية الإنهاء النظيف فقد لا يكون أمامك سوى إشارتي <code>INT</code> أو <code>KILL</code>، فمثلًا إن لم تتوقف عملية باستخدام ctrl+c فمن الأفضل استخدام <code>kill -9</code> على معرِّف تلك العملية:<syntaxhighlight lang="bash">
أما إن أرسلت إشارة <code>SIGKILL</code> إلى عملية فإنك تلغي أي فرصة لها في تنفيذ تنظيف وإغلاق منظم مما قد يُحدث عواقب مؤسفة. لكن لو لم تنجح عملية الإنهاء النظيف فقد لا يكون أمامك سوى إشارتي <code>INT</code> أو <code>KILL</code>، فمثلًا إن لم تتوقف عملية باستخدام ctrl+c فمن الأفضل استخدام <code>kill -9</code> على معرِّف تلك العملية:<syntaxhighlight lang="bash">
سطر 80: سطر 77:


وفي حالة فتح العملية لأكثر من نسخة فإن استخدام <code>killall</code> يكون أسهل حينها، وهذا الأمر يأخذ نفس خيارات الأمر <code>kill</code> العادي، لكنه يطبقها على كل نسخ العملية التي يستهدفها. لكن يجب أن تختبر هذا الأمر قبل استخدامه في بيئة إنتاج إذ أنه قد لا يعمل كما يجب في بعض أنظمة يونكس التجارية.
وفي حالة فتح العملية لأكثر من نسخة فإن استخدام <code>killall</code> يكون أسهل حينها، وهذا الأمر يأخذ نفس خيارات الأمر <code>kill</code> العادي، لكنه يطبقها على كل نسخ العملية التي يستهدفها. لكن يجب أن تختبر هذا الأمر قبل استخدامه في بيئة إنتاج إذ أنه قد لا يعمل كما يجب في بعض أنظمة يونكس التجارية.
== انظر أيضًا ==
== انظر أيضًا ==
[[Bash/traps|الأفخاخ في Bash]]
* [[Bash/traps|الأفخاخ في Bash]].
 
* [[Bash/more Bash options|المزيد من خيارات Bash]].
[[Bash/more Bash options|المزيد من خيارات Bash]]


== مصادر ==
== مصادر ==
مشروع توثيق لينكس، [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_01.html#sect_12_01_01 الإشارات].
* دليل Bash للمبتدئين، [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_01.html#sect_12_01_01 الإشارات].
[[تصنيف:bash]]
[[تصنيف:Bash]]
[[تصنيف:bash signals]]
[[تصنيف:Bash signals]]
[[تصنيف:Bash Grep]]
[[تصنيف:Bash Kill Command]]

المراجعة الحالية بتاريخ 00:56، 7 سبتمبر 2018

صفحة man للإشارات

يحتوي نظامك على صفحة man بها كل الإشارات المتاحة، لكن قد يُفتح بطريقة مختلفة اعتمادًا على نظام تشغيلك، والطريقة التي ستجدها في أغلب أنظمة لينكس هي man 7 signal، لكن إن كنت في ريب من الأمر فحدد صفحة man والقسم الذي تريده بالضبط باستخدام أوامر مثل:

man -k signal | grep list

أو

apropos signal | grep list

ستجد أسماء الإشارات باستخدام kill -l.

الإشارات إلى صدفة Bash الخاصة بك

تتجاهل صدفة bash التفاعلية إشارتي SIGTERM و SIGQUIT في غياب الأفخاخ (Traps)، وتُلتقط SIGINT ويُتعامل معها، ويتم تجاهل كل من SIGTTIN و SIGTTOU و SIGTSTP إن كان التحكم في الوظائف (job control) نشطًا. وكذلك فإن الأوامر التي تُشغَّل كنتيجة لاستبدال الأوامر (command substitution) تتجاهل أيضًا تلك الإشارات حين تولَّد عن طريق لوحة المفاتيح.

افتراضيًا، تُغلِق إشارةُ SIGHUP الصدفة، وسوف ترسل الصدفة التفاعلية إشارة SIGHUP إلى كل الوظائف (jobs) سواء العاملة منها أو المتوقفة، انظر توثيق أمر disown إن كنت تريد إيقاف هذا السلوك الافتراضي لعملية معينة.

استخدم خيار huponexit لقتل كل الوظائف عند استقبال إشارة SIGHUP باستخدام أمر shopt.

إرسال الإشارات باستخدام الصدفة

يمكن إرسال الإشارات التالية باستخدام صدفة bash:

جدول 12-1. إشارات التحكم في Bash

المجموعة الافتراضية للمفاتيح الوظيفة
ctrl+c إشارة الاعتراض، ترسل SIGINT إلى الوظيفة التي تعمل في الواجهة.
ctrl+y إشارة الإيقاف المؤجل، تُوقِف العملية الحالية حين تحاول قراءة مدخلات من الطرفية ويعود التحكم إلى الصدفة، ويستطيع المستخدم قتل العملية أو جعلها تعمل في الواجهة أو الخلفية. لا تتاح إشارة الإيقاف المؤجل إلا على أنظمة التشغيل التي تدعم هذه الخاصية.
ctrl+z إشارة الإيقاف، ترسل SIGTSTP إلى برنامج ما لإيقافه ومن ثَم إعادة التحكم إلى الصدفة.

إعدادات الطرفية

تفقَّد إعدادات stty لديك إذ أن إيقاف وإعادة التشغيل لخرج ما تكون عادة معطلة إن كنت تستخدم محاكيات طرفية حديثة، أما xterm فتدعم ctrl+s و ctrl+q افتراضيًا

استخدام الإشارات مع kill

تحتوي أغلب الصدفات الحديثة -بما فيها bash- على أمر kill مضمَّن، وتقبل bash الأسماء والأرقام كخيارات، وكذلك مسموح أن تكون الوسائط معرفات للوظائف أو العمليات. ويمكن إرسال تقرير بحالة خروج باستخدام الخيار l- بحيث يعطي صفرًا في حالة نجاح إرسال إشارة واحدة على الأقل، وقيمة غير صفرية في حالة الأخطاء.

قد يفعِّل النظام خيارات إضافية عند استخدام أمر kill من usr/bin/، مثل إمكانية قتل العمليات من معرّف مستخدم (user ID) غير المعرّف الخاص بك، وتحديد العمليات بأسمائها، مثل pgrep و pkill. يرسل كلا أمريْ kill إشارة TERM إن لم يُعط لها شيء.

هذه قائمة بالإشارات المشهورة:

جدول 12-2. إشارات القتل المشهورة في Bash

اسم الإشارة قيمة الإشارة التأثير
SIGHUP 1 إغلاق (hangup)
SIGINT 2 اعتراض من لوحة المفاتيح
SIGKILL 9 إشارة قتل
SIGTERM 15 إشارة إنهاء (termination)
SIGSTOP 17، 19، 23 إيقاف العملية (stop)

SIGKILL و SIGSTOP

لا يمكن التقاط أو حجب أو تجاهل SIGKILL أو SIGSTOP.

حين تريد قتل عملية أو سلسلة عمليات فمن المنطقي أن تبدأ بإشارة SIGTERM لأنها الإشارة الأقل خطورة وأثرًا، فبتلك الطريقة تحظى البرامج التي صُممت لتتبع إجراءات مرتبة للإغلاق بفرصة لاتباع تلك الإجراءات التي صُمِّمَت لتنفذها حين تستلم إشارة SIGTERM، مثل عمليات التنظيف والمسح (cleaning up) وإغلاق الملفات المفتوحة. أما إن أرسلت إشارة SIGKILL إلى عملية فإنك تلغي أي فرصة لها في تنفيذ تنظيف وإغلاق منظم مما قد يُحدث عواقب مؤسفة. لكن لو لم تنجح عملية الإنهاء النظيف فقد لا يكون أمامك سوى إشارتي INT أو KILL، فمثلًا إن لم تتوقف عملية باستخدام ctrl+c فمن الأفضل استخدام kill -9 على معرِّف تلك العملية:

hsoub: ~> ps -ef | grep stuck_process
hsoub    5607   2214  0 20:05 pts/5    00:00:02 stuck_process

hsoub: ~> kill -9 5607

hsoub: ~> ps -ef | grep stuck_process
hsoub    5614    2214 0 20:15 pts/5    00:00:00 grep stuck_process
[1]+ Killed		stuck_process

وفي حالة فتح العملية لأكثر من نسخة فإن استخدام killall يكون أسهل حينها، وهذا الأمر يأخذ نفس خيارات الأمر kill العادي، لكنه يطبقها على كل نسخ العملية التي يستهدفها. لكن يجب أن تختبر هذا الأمر قبل استخدامه في بيئة إنتاج إذ أنه قد لا يعمل كما يجب في بعض أنظمة يونكس التجارية.

انظر أيضًا

مصادر