बैश स्क्रिप्ट SIGHUP नहीं देखता है?


11

मुझे निम्नलिखित स्क्रिप्ट मिली है:

#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat    # wait indefinitely

जब मैं भेजता हूं SIGHUP(उपयोग करता हूं kill -HUP pid), तो कुछ भी नहीं होता है।

अगर मैं स्क्रिप्ट को थोड़ा बदलूं:

#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT    # add this
trap "echo HUP" SIGHUP
cat    # wait indefinitely

... फिर स्क्रिप्ट echo HUPठीक वैसे ही काम करती है, जब वह बाहर निकलती है (जब मैं Ctrl + C दबाता हूं):

roger@roger-pc:~ $ ./hupper.sh 
We are 6233
^CHUP

क्या चल रहा है? मुझे SIGHUPइस स्क्रिप्ट पर एक संकेत कैसे भेजना चाहिए (यह जरूरी नहीं है ) होना चाहिए ?


4
सिग्नल दिया जाएगा और सिग्नल हैंडलर catप्रक्रिया समाप्त होने पर निष्पादित करेगा । प्रक्रिया से बाहर निकलने के Ctrl+Dलिए अपनी मूल स्क्रिप्ट आज़माएं और दबाएं cat। जबकि catप्रक्रिया अग्रभूमि में है, HUPसिग्नल पर कार्रवाई नहीं की जाती है। catद्वारा प्रतिस्थापित read( फिर से बनाया गया शेल) द्वारा पुन: प्रयास करें ।
Kusalananda

उत्तम। क्या कोई कल्पना करता है कि एक उत्तर में बदल जाए?
रोजर लिप्सकॉम्ब

मुझे पता है कि यह इस तरह से काम करता है, लेकिन मैं किसी ऐसे व्यक्ति को जाने दूंगा जो मेरे बारे में अधिक जानकारी रखता है और जो जवाब देता है।
Kusalananda

मैंने while true; do read; doneअंत में उपयोग किया , अन्यथा पाठ में प्रवेश करने के कारण इसे भी छोड़ दिया जाता है, और मैं चाहता हूं कि यह Ctrl + C पर छोड़ दें।
रोजर लिप्सकॉम्ब

जवाबों:


21

बैश मैनुअल में कहा गया है:

यदि बैश एक कमांड के पूरा होने की प्रतीक्षा कर रहा है और एक सिग्नल प्राप्त करता है जिसके लिए एक जाल स्थापित किया गया है, तो ट्रैप तब तक निष्पादित नहीं होगा जब तक कि कमांड पूरा नहीं हो जाता।

इसका मतलब है कि सिग्नल bashभेजने के बावजूद जब आप इसे भेजते हैं, तो SIGHUP पर आपका जाल केवल catसमाप्त होने पर ही कहा जाएगा ।

यदि यह व्यवहार अवांछनीय है, तो या तो bashबिलिंस का उपयोग करें (जैसे read+ के printfबजाय एक लूप में cat) या बैकग्राउंड जॉब्स का उपयोग करें ( स्टीफन का उत्तर देखें )।


9

@xhienne पहले ही बता चुका है कि क्यों , लेकिन अगर आप चाहते थे कि सिग्नल सीधे काम करे (और स्क्रिप्ट से बाहर न जाए), तो आप अपना कोड बदल सकते हैं:

#! /bin/bash -
interrupted=true
trap 'interrupted=true; echo HUP' HUP

{ cat <&3 3<&- & pid=$!; } 3<&0

while
  wait "$pid"
  ret=$?
  "$interrupted"
do
  interrupted=false
done
exit "$ret"

फ़ाइल डिस्क्रिप्टर के साथ थोड़ा नृत्य इस तथ्य के इर्द-गिर्द काम करता है कि पृष्ठभूमि में लॉन्च की गई कमांड के लिए bashस्टड पुनर्निर्देशित करता है /dev/null


क्या यह काम करता है क्योंकि कोड ब्लॉक एक सब-टाइम में चलता है?
पिसिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.