अंतिम लक्ष्य: बैश स्क्रिप्ट जो पृष्ठभूमि नौकरियों को समाप्त करने की प्रतीक्षा कर रहा है, पहले Ctrl-c
पर निरस्त नहीं है; इसके बजाय, इसे छोड़ने के लिए इसे दूसरे Ctrl-c
की आवश्यकता होती है।बैश: स्क्रिप्ट से बाहर निकलने के लिए डबल Ctrl-c की आवश्यकता हो सकती है?
मुझे अच्छी तरह से पता है कि कैसे BASH-buildin trap
काम करता है। आप या तो:
एक संकेत पूरी तरह अनदेखी करने के लिए इसका इस्तेमाल (जैसे,
trap '' 2
) ... याका प्रयोग करें यह एक संकेत मूल कार्य होने की अनुमति दी है इससे पहले निष्पादित मनमाना आदेशों के लिए (जैसे ,
trap cmd 2
, जहांcmd
माता पिता स्क्रिप्ट से पहले चलाया जाता हैSIGINT
के कारण बाधित हो जाएगा)
तो सवाल यह करने पर निर्भर करता:
012,351,मैं कैसे प्रभावी ढंग से & 2 एक साथ गठजोड़ कर सकते हैं, यानी, को रोकने के अंत परिणाम एक संकेत करने के लिए नेतृत्व करेंगे (- जैसे, कारण
SIGINT
रद्द स्क्रिप्ट बंद) करते हुए भी कि बनाने संकेत कुछ और कारण (- उदाहरण के लिए, काउंटर में वृद्धि, काउंटर की जांच करें और सशर्त रूप से या तो चेतावनी या बाहर निकलें)।
अधिक बस रखो:
मैं एक संकेत कैसे कर सकते हैं कोई अन्य विषय कुछ करना; इससे पहले कि यह अपनी बात करता है, नौकरी न डालें।
यहां कुछ उदाहरण कोड दिखाया गया है जो मैं लक्षित कर रहा हूं; हालांकि, यह निश्चित रूप से काम नहीं करता है - क्योंकि trap
केवल या ऊपर से ही कर सकता है।
#!/bin/bash
declare -i number_of_times_trap_triggered
cleanup_bg_jobs() {
number_of_times_trap_triggered+=1
if [[ ${number_of_times_trap_triggered} -eq 1 ]]; then
echo "There are background jobs still running"
echo "Hit Ctrl-c again to cancel all bg jobs & quit"
else
echo "Aborting background jobs"
for pid in ${bg_jobs}; do echo " Killing ${pid}"; kill -9 ${pid}; done
fi
}
f() { sleep 5m; }
trap cleanup_bg_jobs 2
bg_jobs=
for job in 1 2 3; do
f &
bg_jobs+=" $!"
done
wait
तो यह उत्पादन आप अंत हो रही है जब आप Ctrl-c
एक बार प्रेस है।
[rsaw:~]$ ./zax
^CThere are background jobs still running
Hit Ctrl-c again to cancel all bg jobs & quit
[rsaw:~]$ ps axf|tail -6
24569 pts/3 S 0:00 /bin/bash ./zax
24572 pts/3 S 0:00 \_ sleep 5m
24570 pts/3 S 0:00 /bin/bash ./zax
24573 pts/3 S 0:00 \_ sleep 5m
24571 pts/3 S 0:00 /bin/bash ./zax
24574 pts/3 S 0:00 \_ sleep 5m
बेशक मैं पहली बार Ctrl-c
पर नौकरियों को साफ करने को संशोधित कर सकता है, लेकिन यह है कि नहीं है कि मैं क्या चाहता हूँ। मैं पहले ट्रैप ट्रिगर होने के बाद बाश को छोड़ने से रोकना चाहता हूं ... जब तक कि यह दूसरी बार ट्रिगर न हो जाए।
पुनश्च: लक्ष्य मंच लिनक्स है (मैं POSIX अनुपालन के बारे में कम परवाह नहीं कर सकता है) मार v4 वाले +
आमतौर पर इस मामले में, दो Ctrl + C को प्रोग्राम को रोकने के लिए निरंतर होना आवश्यक है। इसलिए, जब एक कुंजी डाउन कैप्चर की जाती है तो एक बेहतर समाधान को ATTEMP को 0 पर सेट करना चाहिए। –
वैली की कोशिश करने के लिए धन्यवाद, लेकिन आप जो पेशकश कर रहे हैं वह वास्तव में जो मैंने पूछा है उसका जवाब नहीं देता है। पहले 'echo Shutdown.' कमांड चलाने के बाद यह बंद हो जाएगा। – rsaw
पीएस: मैंने अपनी पोस्ट को अपने कुछ उदाहरण कोड के साथ अपडेट किया ताकि यह दिखाया जा सके कि 'जाल' काम नहीं करता है कि आप कैसे सोचते हैं कि यह काम करता है। (जब तक मैं पागल नहीं हूं।) – rsaw