← Back to Bash Course | Chapter 11: Process Management | Lesson 6 of 12

Signals और trap

Signals एक running program को भेजी गई छोटी notifications हैं, जैसे "please stop" या "clean up now", और trap एक script को इन पर react करने देता है बजाय सिर्फ silently kill होने के।
Syntax
bash
trap 'commands' EXIT
trap 'commands' SIGNAL

Cleanup with an EXIT Trap

trap commands EXIT ऐसा code register करता है जो script exit होने पर automatically run होता है, चाहे यह normally खत्म हुआ हो, exit hit किया हो, या fail हुआ हो, जो इसे cleanup (जैसे temp files हटाना) होने की guarantee देने का standard तरीका बनाता है।

उदाहरण: Cleanup with an EXIT Trap

bash
#!/bin/bash
trap 'echo "cleanup: removing temp file"; rm -f /tmp/trap_demo_$$.txt' EXIT
echo "work" > "/tmp/trap_demo_$$.txt"
echo "doing some work..."

Handling a Self-Sent Signal Safely

SIGUSR1 एक user-defined signal है जिसका default action, trap न किए जाने पर, सिर्फ process terminate करना है; इसे trap करना एक script को एक self-sent (या externally sent) signal पर outright kill होने के risk के बिना react करने देता है, SIGTERM या SIGINT के विपरीत जो demonstrate करने के लिए riskier हैं।

Warning: Demo के लिए SIGTERM या SIGINT trap करना riskier है: अगर handler explicitly termination रोकता नहीं है, तो shell अब भी 128+signal status के साथ exit हो सकती है, यही कारण है कि SIGUSR1 एक safer teaching example है।

उदाहरण: Handling a Self-Sent Signal Safely

bash
#!/bin/bash
handle_usr1() {
    echo "received SIGUSR1, handling it gracefully"
}
trap handle_usr1 SIGUSR1

kill -SIGUSR1 $$
echo "script continues normally after the signal was handled"

Combining Multiple Traps

एक script अलग signals के लिए अलग handlers register कर सकता है, और एक EXIT trap एक signal-triggered handler run होने के बाद भी fire होगा, जो आपको signal-specific reactions को general cleanup से अलग करने देता है।

उदाहरण: Combining Multiple Traps

bash
#!/bin/bash
trap 'echo "final cleanup ran"' EXIT
trap 'echo "custom SIGUSR1 handler ran"' SIGUSR1

kill -SIGUSR1 $$
echo "main script logic continues"

Resetting a Trap

trap - SIGNAL पहले set किए गए handler को हटाता है और signal के default behavior को restore करता है, जो उपयोगी है जब script का एक risky section जिसे special handling चाहिए थी पूरा हो जाए।

उदाहरण: Resetting a Trap

bash
#!/bin/bash
trap 'echo "handler active"' SIGUSR1
kill -SIGUSR1 $$

trap - SIGUSR1
echo "handler removed, back to default behavior for SIGUSR1"
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. यह भूल जाना कि EXIT trap script के हर तरह के exit पर fire होता है, सिर्फ errors पर नहीं।
  2. एक teaching example के रूप में खुद को SIGTERM या SIGINT भेजना और यह देखकर surprised होना कि script असल में terminate हो जाता है; एक trapped signal अब भी process को खत्म कर सकता है अगर handler इसे prevent न करे, और script का exit status 128+signal number बन जाता है।
  3. एक signal के लिए trap को उस point के बाद set करना जहां यह occur हो सकता था, उस window को miss करते हुए जिसे यह guard करने वाला था।
चैप्टर सारांश
  • trap commands EXIT commands को script के exit होने पर, किसी भी कारण से, run करता है, जो इसे cleanup के लिए ideal बनाता है।
  • trap commands SIGNAL commands को उस specific signal आने पर run करता है, signal के default action के बजाय।
  • kill -SIGNAL $$ current script की अपनी process को एक signal भेजता है।
  • एक process जो एक fatal signal receive करती है और इसे पूरी तरह handle नहीं करती typically 128 + signal number status के साथ exit होती है।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.