2013-04-03 7 views
19

को अनदेखा करें और अनदेखा करें क्या एसआईजीआईएनटी को रोकने, कुछ करने के लिए बाश में संभव है, और फिर इसे अनदेखा करें (बैश चलाना जारी रखें)।बैश में सिगिनट को पकड़ें,

मुझे पता है कि मैं

trap '' SIGINT 

साथ SIGINT अनदेखा कर सकते हैं और मैं भी

trap handler SIGINT 

साथ SIGINT पर कुछ कर सकते हैं लेकिन यह अभी भी handler कार्यान्वित के बाद स्क्रिप्ट बंद हो जाएगा। जैसे

#!/bin/bash 

handler() 
{ 
    kill -s SIGINT $PID 
} 

program & 
PID=$! 

trap handler SIGINT 

wait $PID 

#do some other cleanup with results from program 

जब मैं Ctrl + C दबाएं, कार्यक्रम के लिए SIGINT भेजा जाएगा, लेकिन पार्टी wait से पहले कार्यक्रम ठीक से बंद हो गया था और उसके संकेत हैंडलर में इसके उत्पादन के लिए बनाया छोड़ देगा।

का उपयोग @suspectus जवाब मैं बदल सकते हैं wait $PID रहे हैं:

while kill -0 $PID > /dev/null 2>&1 
do 
    wait $PID 
done 

यह वास्तव में मेरे लिए काम करता मैं सिर्फ 100% यकीन है कि अगर यह 'स्वच्छ' या 'गंदा वैकल्पिक हल' है हूँ।

+2

यह इसे कई बार क्यों प्रिंट करेगा? – cnicutar

+0

@cnicutar: अगर मैं ctrl + c कई बार दबाता हूं (जो कि मैं वर्तमान रूप में नहीं कर सकता, क्योंकि यह पहले के बाद बंद हो जाता है) – Zulan

+0

मैंने अपना उदाहरण वास्तविक उपयोग केस के करीब होने के लिए बदल दिया है। – Zulan

उत्तर

4

जाल हैंडलर से वापस आ जाएगा, लेकिन के बाद हैंडलर को बुलाया जाने वाला आदेश कहा जाता है।

तो समाधान थोड़ा बेकार है लेकिन मुझे लगता है कि यह आवश्यक है। trap handler INT भी काम करेगा।

trap 'echo "Be patient"' INT 

for ((n=20; n; n--)) 
do 
    sleep 1 
done 
+0

1. काम नहीं कर रहा; 2. शायद यह नहीं है कि उपयोगकर्ता क्या चाहता है। – anishsane

+0

यदि जाल ट्रिगर किया गया है (ऐसा करने के लिए, आपको 'नींद 1' को 'नींद 1 और प्रतीक्षा' के साथ प्रतिस्थापित करने की आवश्यकता है), लूप नियंत्रण-सी दबाकर बाहर निकलता है; आप चलना जारी नहीं रखते हैं जहां जाल रिटर्न के बाद सिग्नल हुआ था। – chepner

+1

@anishsane 2. उपयोगकर्ता क्या चाहता है? मैंने सोचा कि उपयोगकर्ता SIGINT को फंसाना चाहता था और अपनी लिपि का नियंत्रण बनाए रखना चाहता था। – suspectus

संबंधित मुद्दे