كيف يمكنني فخ SIGQUIT بشكل صحيح في باش السيناريو ؟
سؤال
أستطيع كتابة البرامج النصية قذيفة هذا الفخ SIGINT
على ما يرام, ولكن أنا لا يمكن أن يبدو فخ SIGQUIT
.
#!/bin/bash
function die {
echo "Dying on signal $1"
exit 0
}
trap 'die "SIGINT"' SIGINT
trap 'die "SIGQUIT"' SIGQUIT
while true; do
echo "sleeping..."
sleep 5
done
تنفيذ هذا السيناريو و الضغط CTRL-C
وقد التأثير المطلوب, ولكن الضغط CTRL-\
(وهو كما أفهم أن تؤدي SIGQUIT
) لا يفعل شيئا إلا طباعة ^\
في المحطة.لماذا ؟
لدي اثنين من تشغيل النظريات.الأول هو أن دلالات SIGINT
و SIGQUIT
مختلفة مثل أن SIGQUIT
فقط يتم إرسالها إلى عملية طفل sleep
, في حين SIGINT
يحصل إرسالها إلى كل عملية الطفل و الوالدين باش عملية.إذا كان هذا هو الحال ، أين هو موثق ؟
الثاني النظرية التي باش لا تتجاهل فقط (أي لا op معالج) SIGQUIT
بشكل افتراضي (مثل صفحة يوحي) ، ولكن لا تسمح لها أن تكون المحاصرين في كل شيء.هذه نظرية التداخل مع النظرية الأولى ، لأنه يمكن أن يكون حال SIGQUIT
هو الذهاب إلى كل من الأم والطفل ، ولكن الوالد (bash
) فقط لا اعتراض عليه.إذا كان هذا هو الحال, هناك أي طريقة فخ SIGQUIT
في باش السيناريو ؟ ...ربما بعض shopt
يمكن أن أحدد ؟
تحرير:هذا هو على أوبونتو 10.10 في gnome-terminal 2.32.0 تشغيل باش 4.1.5, ونعم ^\
تم تكوين المسألة SIGQUIT (كما ذكرت من قبل stty -a
وأكد خلال إصدار ^\
SIGQUITs إلى برامج أخرى مثل ping
).
تحديث:أنا فقط اكتشفت أن المشكلة يجب أن يكون راجعا بطريقة أو بأخرى إلى gnome-terminal.إن تشغيل هذا البرنامج النصي من وحدة التحكم الظاهرية (أي ، ctrl-alt-f1
للخروج من X) ، الفخاخ SIGQUIT على ما يرام تماما عندما اضغط ^\
.نفس باش كل شيء ، حتى الفرق الوحيد يجب أن يكون محطة المحاكي.حتى الآن يصبح السؤال:كيف يمكنني تكوين gnome-terminal تتصرف مثل وحدة التحكم الظاهري في هذا الصدد ؟ أنا diff
'د مخرجات stty -a
في وحدة التحكم الظاهري في gnome-terminal ، في حين أن هناك اختلافات ، لا شيء يبدو على الفور ذات الصلة (على سبيل المثال ، على حد سواء لديهم quit = ^\;
).
تحديث 2:تجربة أخرى.ببساطة تنفيذ $ sleep 60
في gnome-terminal;اضغط ^\
و تذهب إشارة غير مسك.الآن تنفيذ $ sleep 60
في وحدة التحكم الظاهري;اضغط ^\
و الإشارة هو اشتعلت -- عملية طباعة Quit
والمخارج.ولكن الآن تشغيل $ ping google.com
في gnome-terminal ثم اضغط ^\
-- إشارة اشتعلت والتعامل معها كما هو متوقع.حتى لا يكون هناك شيء غريب حول gnome-terminal هذه SIGQUIT يمكن أن تكون اشتعلت من قبل بعض البرامج ، ولكن ليس قبل الآخرين ، حتى لو كانت تلك الأخرى الآخرين هل قبض عليه عند استدعاء من وحدة التحكم الظاهري.ربما يجب فقط ترقية gnome-terminal.
المحلول
أستطيع إلا أن نفترض أن هذا كان نوعا من الخلل في gnome-terminal 2.32.0;لدي منذ ترقيتها إلى أوبونتو 11.04, مع gnome-terminal 2.32.1 (و باش 4.2.8) و SIGQUIT الآن محاصرا كما هو متوقع.
نصائح أخرى
ألاحظ نفس السلوك على فيدورا 19 مع XFCE:وفقا ps s
, باش في xfce4-المحطة قد SIGQUIT تجاهل تشغيل yes >/dev/null &
ثم ps s
يظهر أنه حتى subprocess وقد SIGQUIT تجاهلها.عندما كنت (من نفس المحطة) تشغيل ssh localhost
, شل في ssh الدورة أيضا SIGQUIT تجاهلها ، ولكن yes >/dev/null &
وقد لا.
على ضوء ما سبق التعليق الذي يذكر gnome-terminal, أعتقد أن الخلل هو في الجزء المشترك من اثنين من المحطات:على vte
المكتبة.لي vte-0.28.2-9.fc19.x86_64
.