सफ़ाई और सिग्नल के लिए Trap हैंडलर
अस्थायी फ़ाइलें हटाने और अधूरे काम को विश्वसनीय रूप से वापस करने के लिए EXIT, ERR और INT ट्रैप पंजीकृत करें।
सफ़ाई और सिग्नल के लिए Trap हैंडलर, CoddyKit पर Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
ट्रैप हैंडलर क्यों महत्वपूर्ण हैं
जब कोई Bash स्क्रिप्ट बाहर निकलती है — चाहे सामान्य रूप से, किसी त्रुटि के कारण, या उपयोगकर्ता द्वारा Ctrl+C दबाने पर — तो वह अस्थायी फ़ाइलें, अधूरा लिखा डेटा या खराब स्थिति छोड़ सकती है। सफ़ाई के बिना ये अवशेष जमा होते जाते हैं और ऐसी समस्याएँ पैदा करते हैं जिन्हें ढूँढ़ना कठिन होता है।
ट्रैप हैंडलर किसी फ़ंक्शन या कमांड को पंजीकृत करके इस समस्या का समाधान करते हैं, जिसे कोई विशिष्ट सिग्नल या छद्म-सिग्नल मिलने पर Bash अपने-आप चलाता है।
- EXIT — स्क्रिप्ट किसी भी कारण से बाहर निकलने पर चलता है
- ERR — किसी भी कमांड द्वारा गैर-शून्य निकास स्थिति लौटाने के बाद चलता है
- INT — उपयोगकर्ता द्वारा SIGINT (Ctrl+C) भेजने पर चलता है
- TERM — SIGTERM मिलने पर चलता है (जैसे
killसे)
अच्छी तरह लिखी गई स्क्रिप्ट इन ट्रैप को सबसे ऊपर, किसी जोखिमपूर्ण कार्य के शुरू होने से पहले, पंजीकृत करती है।
trap बिल्ट-इन का सिंटैक्स
trap बिल्ट-इन एक या अधिक सिग्नल या छद्म-सिग्नल के लिए हैंडलर पंजीकृत करता है। सामान्य सिंटैक्स है:
trap 'command_or_function' SIGNAL [SIGNAL...]
मुख्य नियम:
- पहला आर्ग्युमेंट शेल कोड की उद्धृत स्ट्रिंग (या फ़ंक्शन का नाम) होता है, जिसे सिग्नल चलने पर निष्पादित किया जाता है।
- हैंडलर के बाद आप कई सिग्नल सूचीबद्ध कर सकते हैं।
trap '' SIGNALउस सिग्नल को अनदेखा करता है (खाली हैंडलर)।trap - SIGNALसिग्नल को उसके डिफ़ॉल्ट व्यवहार पर रीसेट करता है।
एक ही शेल में बुलाए गए फ़ंक्शन ट्रैप को विरासत में लेते हैं, लेकिन ( ) या & से बनाए गए सबशेल उन्हें विरासत में नहीं लेते।
#!/usr/bin/env bash
# Syntax examples — not a full script
# Register a cleanup function on EXIT
trap cleanup EXIT
# Inline handler for INT and TERM
trap 'echo "Interrupted!"; exit 1' INT TERM
# Ignore SIGHUP
trap '' HUP
# Reset SIGPIPE to default
trap - PIPEEXIT ट्रैप — आपकी सुरक्षा-जाल
EXIT छद्म-सिग्नल सबसे महत्वपूर्ण ट्रैप है जिसे पंजीकृत किया जाना चाहिए। शेल किसी भी कारण से बाहर निकलने पर यह चलता है: सामान्य रूप से पूरा होने पर, exit N पर, बिना संभाली गई त्रुटि पर, या किसी सिग्नल के कारण। इसलिए यह अस्थायी फ़ाइलें हटाने के लिए आदर्श है।
सर्वोत्तम अभ्यास:
- नाम को विशिष्ट और अप्रत्याशित रखने के लिए
mktempसे अस्थायी फ़ाइलें बनाएँ। - पथ को तुरंत एक वैरिएबल में रखें।
- बनाने के तुरंत बाद EXIT ट्रैप पंजीकृत करें, ताकि सफ़ाई हमेशा चले।
स्क्रिप्ट का निकास कोड सुरक्षित रहता है — ट्रैप हैंडलर के निकास कोड को अनदेखा किया जाता है, जब तक कि आप उसके भीतर स्पष्ट रूप से exit न बुलाएँ।
#!/usr/bin/env bash
set -euo pipefail
TMPFILE=$(mktemp /tmp/myapp.XXXXXX)
cleanup() {
echo "Removing temp file: $TMPFILE" >&2
rm -f "$TMPFILE"
}
trap cleanup EXIT
# Do real work
echo "Processing..." > "$TMPFILE"
sort "$TMPFILE" -o "$TMPFILE"
cp "$TMPFILE" /tmp/myapp_result.txt
echo "Done. Result saved."कई अस्थायी फ़ाइलों और डायरेक्टरी को संभालना
वास्तविक स्क्रिप्ट अक्सर कई अस्थायी अवशेष बनाती हैं — फ़ाइलें, डायरेक्टरी, FIFO और लॉक फ़ाइलें। हर एक को अलग-अलग ट्रैक करने के बजाय, उन्हें एक ऐरे में एकत्र करें और एक ही सफ़ाई फ़ंक्शन में सब कुछ हटाएँ।
यह पैटर्न आसानी से विस्तृत किया जा सकता है: जब भी आप कोई नया अस्थायी संसाधन बनाएँ, उसे ऐरे में जोड़ दें। स्क्रिप्ट चाहे जहाँ से बाहर निकले, EXIT ट्रैप हमेशा पूरी सूची को संभालेगा।
#!/usr/bin/env bash
set -euo pipefail
CLEANUP_TARGETS=()
add_cleanup() {
CLEANUP_TARGETS+=("$1")
}
cleanup() {
echo "Running cleanup..." >&2
for target in "${CLEANUP_TARGETS[@]:-}"; do
rm -rf "$target"
echo "Removed: $target" >&2
done
}
trap cleanup EXIT
# Create and track temp resources
TMPDIR_WORK=$(mktemp -d /tmp/work.XXXXXX)
add_cleanup "$TMPDIR_WORK"
TMPFILE_LOG=$(mktemp /tmp/run.XXXXXX.log)
add_cleanup "$TMPFILE_LOG"
echo "Working in $TMPDIR_WORK" | tee "$TMPFILE_LOG"
touch "$TMPDIR_WORK/output.txt"
echo "Step complete."ERR ट्रैप — विफलताओं को पकड़ना
ERR छद्म-सिग्नल तब चलता है, जब कोई सरल कमांड गैर-शून्य निकास स्थिति लौटाता है, बशर्ते शेल विकल्प set -e (errexit) सक्रिय हो या कमांड if, while या ||/&& वाले संयुक्त कथन के भीतर न हो।
ERR ट्रैप का उपयोग करें:
$LINENOऔर$BASH_COMMANDका उपयोग करके यह लॉग दर्ज करने के लिए कि कौन-सी पंक्ति विफल हुई।- EXIT ट्रैप चलने से पहले वापस पहले की स्थिति में लाने का तर्क शुरू करने के लिए।
- stderr में संरचित त्रुटि संदेश भेजने के लिए।
महत्वपूर्ण: ERR ट्रैप फ़ंक्शन के भीतर नहीं चलते, जब तक कि आप स्पष्ट रूप से set -E (errtrace) न चलाएँ, ताकि फ़ंक्शन कॉल करने वाले शेल से ERR ट्रैप विरासत में ले सकें।
#!/usr/bin/env bash
set -eEuo pipefail
on_error() {
local exit_code=$?
local line=$1
echo "ERROR: command failed with exit code $exit_code at line $line" >&2
echo " Command: $BASH_COMMAND" >&2
}
trap 'on_error $LINENO' ERR
echo "Starting task..."
cp /nonexistent/file /tmp/ # This will fail
echo "This line is never reached."INT ट्रैप — Ctrl+C को शालीनता से संभालना
Ctrl+C दबाने पर अग्रभूमि प्रक्रिया समूह को SIGINT भेजा जाता है। ट्रैप के बिना Bash तुरंत बाहर निकल जाता है और संभवतः अधूरा काम पीछे छोड़ देता है।
INT ट्रैप पंजीकृत करने से आप यह कर सकते हैं:
- उपयोगकर्ता के लिए स्पष्ट रद्दीकरण संदेश प्रिंट करना।
- EXIT ट्रैप को नियंत्रण सौंपने से पहले बीच में वापस पहले की स्थिति में लाने का कोई भी कार्य करना।
- अर्थपूर्ण स्थिति कोड के साथ बाहर निकलना (
130SIGINT के लिए प्रचलित कोड है:128 + 2)।
अपने INT हैंडलर के पूरा होने के बाद सही निकास कोड आगे भेजने के लिए exit 130 चलाएँ। इसके बाद EXIT ट्रैप अपने-आप चलेगा।
#!/usr/bin/env bash
set -euo pipefail
TMPFILE=$(mktemp /tmp/demo.XXXXXX)
cleanup() {
rm -f "$TMPFILE"
echo "Temp file removed." >&2
}
on_interrupt() {
echo "" >&2
echo "Caught SIGINT — cancelling gracefully." >&2
exit 130 # EXIT trap (cleanup) runs automatically after this
}
trap cleanup EXIT
trap on_interrupt INT
echo "Running long task. Press Ctrl+C to cancel."
for i in $(seq 1 10); do
echo "Step $i/10..."
sleep 1
done
echo "All steps complete."EXIT, ERR और INT ट्रैप को संयोजित करना
उत्पादन स्क्रिप्ट में, आम तौर पर बाहर निकलने के हर मार्ग को संभालने के लिए आप तीनों ट्रैप एक साथ पंजीकृत करते हैं:
- EXIT — हमेशा चलता है और फ़ाइलों की सफ़ाई करता है।
- ERR — विफल कमांड और पंक्ति संख्या का लॉग दर्ज करता है।
- INT — रद्दीकरण संदेश प्रिंट करता है और कोड 130 के साथ बाहर निकलता है।
चूँकि EXIT हमेशा अंत में चलता है, इसलिए आपकी सफ़ाई का तर्क केवल एक ही स्थान पर होना चाहिए। ERR और INT हैंडलर लॉग दर्ज करने और स्थिति तय करने पर ध्यान दे सकते हैं, फिर exit बुलाकर वास्तविक सफ़ाई EXIT को सौंप सकते हैं।
ऊपर set -eEuo pipefail का उपयोग करें, ताकि फ़ंक्शन की त्रुटियाँ भी ERR को सक्रिय करें और pipefail पाइपलाइन के भीतर की विफलताओं को पकड़ सके।
#!/usr/bin/env bash
set -eEuo pipefail
TMPFILE=$(mktemp /tmp/combined.XXXXXX)
ROLLBACK_NEEDED=false
cleanup() {
if [[ "$ROLLBACK_NEEDED" == true ]]; then
echo "Rolling back partial changes..." >&2
fi
rm -f "$TMPFILE"
echo "Cleanup done." >&2
}
on_error() {
ROLLBACK_NEEDED=true
echo "ERR at line $1: $BASH_COMMAND" >&2
}
on_interrupt() {
echo "Interrupted by user." >&2
exit 130
}
trap cleanup EXIT
trap 'on_error $LINENO' ERR
trap on_interrupt INT
echo "hello" > "$TMPFILE"
echo "Script finished successfully."ट्रैप को गतिशील रूप से रीसेट और बंद करना
कभी-कभी आपको स्क्रिप्ट के बीच में ट्रैप बदलने की आवश्यकता होती है — उदाहरण के लिए, किसी महत्वपूर्ण खंड के पूरा होने के बाद एक बार की सफ़ाई करनी हो, ताकि बाद के सामान्य कार्य अनावश्यक रूप से वापस पहले की स्थिति में लाने की प्रक्रिया शुरू न करें।
trap - SIGNALसिग्नल को उसके बिल्ट-इन डिफ़ॉल्ट व्यवहार पर रीसेट करता है।trap '' SIGNALसिग्नल को पूरी तरह अनदेखा करता है (प्रक्रिया को उससे समाप्त नहीं किया जा सकता)।- आप किसी भी समय नया हैंडलर फिर से पंजीकृत कर सकते हैं; सबसे बाद में की गई
trapकॉल प्रभावी होती है।
एक सामान्य पैटर्न यह है कि जोखिमपूर्ण कार्य सफल होने के बाद EXIT ट्रैप को बेहतर बनाया जाए और वापस पहले की स्थिति में लाने वाले हैंडलर की जगह सरल सफ़ाई हैंडलर लगाया जाए।
#!/usr/bin/env bash
set -euo pipefail
TMPFILE=$(mktemp /tmp/staged.XXXXXX)
rollback() {
echo "ROLLBACK: removing $TMPFILE" >&2
rm -f "$TMPFILE"
}
cleanup_only() {
echo "CLEANUP: removing $TMPFILE" >&2
rm -f "$TMPFILE"
}
# Start with rollback in case something fails during the risky phase
trap rollback EXIT
echo "Performing risky operation..."
echo "critical data" > "$TMPFILE"
# ... imagine more risky steps here ...
# Risky phase succeeded — switch to simple cleanup
trap cleanup_only EXIT
echo "Risky phase done. Now doing safe finalization."
cp "$TMPFILE" /tmp/staged_result.txt
echo "All done."ट्रैप के माध्यम से निकास कोड आगे भेजना
एक सूक्ष्म समस्या यह है कि यदि आपके सफ़ाई फ़ंक्शन में विफल होने वाले कमांड हैं, तो स्क्रिप्ट का अंतिम निकास कोड बदल सकता है। मूल निकास कोड को स्पष्ट रूप से सुरक्षित रखें।
ट्रैप हैंडलर के भीतर $? में वह निकास कोड रहता है, जिसने ट्रैप को सक्रिय किया था। हैंडलर की पहली ही पंक्ति में इसे सुरक्षित कर लें, इससे पहले कि कोई अन्य कमांड इसका मान बदल दे।
#!/usr/bin/env bash
set -euo pipefail
TMPFILE=$(mktemp /tmp/exitcode.XXXXXX)
cleanup() {
local original_exit=$? # capture BEFORE any other command
echo "Cleaning up (original exit: $original_exit)" >&2
rm -f "$TMPFILE"
# Exit with the original code so callers see the real result
exit "$original_exit"
}
trap cleanup EXIT
echo "Doing work..."
echo "data" > "$TMPFILE"
# Simulate failure
if [[ ! -f /tmp/required_marker ]]; then
echo "Required marker missing!" >&2
exit 2
fi
echo "Done."फ़ंक्शन और सबशेल में ट्रैप
सही स्क्रिप्ट लिखने के लिए ट्रैप की विरासत को समझना अत्यंत आवश्यक है:
- फ़ंक्शन उसी शेल में चलते हैं और ट्रैप विरासत में लेते हैं — लेकिन ERR फ़ंक्शन में तभी प्रसारित होता है, जब
set -E(errtrace) सक्रिय हो। - सबशेल (
( ... )) पैरेंट के ट्रैप की एक प्रति लेकर शुरू होते हैं, लेकिन सबशेल के भीतर किए गए बदलाव पैरेंट को प्रभावित नहीं करते। - बैकग्राउंड कार्य (
cmd &) सबशेल होते हैं और पैरेंट के INT/TERM ट्रैप विरासत में नहीं लेते (उन्हें डिफ़ॉल्ट सिग्नल व्यवहार मिलता है)।
व्यावहारिक नियम: ट्रैप पंजीकरण को मुख्य स्क्रिप्ट बॉडी में रखें, जब ERR को फ़ंक्शन में प्रसारित करना हो तब set -E का उपयोग करें, और & के पार ट्रैप की विरासत पर कभी निर्भर न रहें।
#!/usr/bin/env bash
set -eEuo pipefail # -E = errtrace: ERR propagates into functions
on_error() {
echo "ERR in function or main at line $1" >&2
}
trap 'on_error $LINENO' ERR
risky_function() {
echo "Inside risky_function"
ls /nonexistent_path # triggers ERR — works because of set -E
}
# Subshell: has its own copy; changes don't affect parent
(
trap '' ERR # disable ERR only inside subshell
ls /nonexistent_path 2>/dev/null || true
echo "Subshell completed without triggering parent ERR"
)
risky_functionवास्तविक पैटर्न: परमाण्विक फ़ाइल प्रतिस्थापन
एक प्रसिद्ध रक्षात्मक Bash पैटर्न परमाण्विक फ़ाइल प्रतिस्थापन है: अस्थायी फ़ाइल में लिखें, फिर उसका नाम बदलकर उसे सही स्थान पर रखें। नाम बदलने से पहले कुछ भी विफल होने पर मूल फ़ाइल अपरिवर्तित रहती है। ट्रैप इसे पूरी तरह सुरक्षित बनाते हैं।
चरण:
- गंतव्य वाले उसी फ़ाइल सिस्टम में एक अस्थायी फ़ाइल बनाएँ (ताकि
mvपरमाण्विक हो)। - यदि हम जल्दी बाहर निकलें, तो अस्थायी फ़ाइल हटाने के लिए EXIT ट्रैप पंजीकृत करें।
- नई सामग्री लिखें और उसकी पुष्टि करें।
- परमाण्विक रूप से नाम बदलें (
mv) — मूल फ़ाइल अब जाकर बदली जाती है। - EXIT ट्रैप अस्थायी फ़ाइल को केवल तभी हटाता है, जब वह अब भी मौजूद हो (सफल
mvके बाद वह हट चुकी होती है)।
#!/usr/bin/env bash
set -euo pipefail
DEST="/tmp/important_config.conf"
TMPFILE=$(mktemp "$(dirname "$DEST")/.tmp.XXXXXX")
cleanup() {
rm -f "$TMPFILE" # no-op if mv already moved it
}
trap cleanup EXIT
# Write new content to temp file
cat > "$TMPFILE" <<'EOF'
[settings]
version=2
mode=production
EOF
# Validate before replacing
if ! grep -q 'version=' "$TMPFILE"; then
echo "Validation failed — aborting replacement" >&2
exit 1
fi
# Atomic rename — DEST is replaced only here
mv "$TMPFILE" "$DEST"
echo "Config updated atomically: $DEST"ज्ञान जाँच: ERR ट्रैप की विरासत
जाँचिए कि Bash में फ़ंक्शन के साथ ERR ट्रैप कैसे व्यवहार करता है।
पुनरावृत्ति: सफ़ाई और सिग्नल के लिए ट्रैप हैंडलर
इस पाठ में आपने ट्रैप हैंडलर के माध्यम से Bash स्क्रिप्ट को अधिक सहनशील बनाना सीखा:
- EXIT आपकी सार्वभौमिक सुरक्षा-जाल है — किसी भी अस्थायी संसाधन को बनाने के तुरंत बाद इसे पंजीकृत करें और मूल निकास कोड सुरक्षित रखने के लिए हमेशा पहले
$?को सहेजें। - ERR आपको
$LINENOऔर$BASH_COMMANDके साथ विफलताओं का लॉग दर्ज करने देता है; फ़ंक्शन में इसे विरासत में देने के लिएset -Eका उपयोग करें। - INT Ctrl+C को शालीनता से संभालता है — संदेश प्रिंट करें और कोड 130 के साथ बाहर निकलें, ताकि EXIT सफ़ाई कर सके।
- अस्थायी संसाधनों को एक ऐरे में एकत्र करें और एक ही सफ़ाई फ़ंक्शन में सभी को हटाएँ।
- ट्रैप को रीसेट करने के लिए
trap - SIGNALऔर सिग्नल को गतिशील रूप से अनदेखा करने के लिएtrap '' SIGNALका उपयोग करें। - परमाण्विक नाम-परिवर्तन पैटर्न (
mktemp→ लिखना → पुष्टि करना →mv) को EXIT ट्रैप के साथ मिलाने पर यह सुनिश्चित होता है कि अधूरे लेखन से गंतव्य फ़ाइल कभी दूषित न हो।
set -eEuo pipefail को उचित स्थानों पर लगाए गए ट्रैप के साथ मिलाने से किसी भी उत्पादन Bash स्क्रिप्ट के लिए ठोस रक्षात्मक आधार मिलता है।
एआई शिक्षक के साथ Bash सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 22
- पाठ
- 88
अक्सर पूछे जाने वाले प्रश्न
क्या “सफ़ाई और सिग्नल के लिए Trap हैंडलर” पाठ निःशुल्क है?
हाँ—“सफ़ाई और सिग्नल के लिए Trap हैंडलर” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“सफ़ाई और सिग्नल के लिए Trap हैंडलर” में मैं क्या सीखूँगा?
अस्थायी फ़ाइलें हटाने और अधूरे काम को विश्वसनीय रूप से वापस करने के लिए EXIT, ERR और INT ट्रैप पंजीकृत करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“सफ़ाई और सिग्नल के लिए Trap हैंडलर” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Linux कमांड लाइन और Bash स्क्रिप्टिंग में महारत पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- set -euo pipefail के साथ सख्त मोड
- सफ़ाई और सिग्नल के लिए Trap हैंडलर
- सुरक्षित अस्थायी फ़ाइलें और लॉक डायरेक्टरी
- Idempotent स्क्रिप्ट और बैकऑफ़ सहित पुनःप्रयास तर्क