الفرق بين المراجعتين لصفحة: «Bash/signals»
أسامه-دمراني (نقاش | مساهمات) إضافة 1.0: عنوان الصفحة |
أسامه-دمراني (نقاش | مساهمات) إزالة أسطر فارغة |
||
سطر 6: | سطر 6: | ||
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: | ||
سطر 32: | سطر 30: | ||
|} | |} | ||
<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> بحيث يعطي صفرًا في حالة نجاح إرسال إشارة واحدة على الأقل، وقيمة غير صفرية في حالة الأخطاء. | ||
سطر 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 الإشارات]. | مشروع توثيق لينكس، [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_01.html#sect_12_01_01 الإشارات]. | ||
[[تصنيف:bash]] | [[تصنيف:bash]] | ||
[[تصنيف:bash signals]] | [[تصنيف:bash signals]] |
مراجعة 13:08، 2 أغسطس 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
العادي، لكنه يطبقها على كل نسخ العملية التي يستهدفها. لكن يجب أن تختبر هذا الأمر قبل استخدامه في بيئة إنتاج إذ أنه قد لا يعمل كما يجب في بعض أنظمة يونكس التجارية.
انظر أيضًا
مصادر
مشروع توثيق لينكس، الإشارات.