$$ मूल आईडी के समान आईडी क्यों लौटा रहा है?


159

मुझे बैश की समस्या है, और मुझे नहीं पता कि क्यों।
खोल के नीचे, मैं दर्ज करता हूं:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

"गेटपिड" एक सी प्रोग्राम है जो वर्तमान पीआईडी ​​पाने के लिए है, जैसे:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

मुझे क्या उलझन है:

  1. मुझे लगता है कि "(कमांड)" एक उप-प्रक्रिया है (क्या मैं सही हूं?), और मुझे लगता है कि इसके माता-पिता को इसके माता-पिता के साथ अलग होना चाहिए, लेकिन वे एक ही हैं, क्यों ...
  2. जब मैं कोष्ठक के बीच pid दिखाने के लिए अपने प्रोग्राम का उपयोग करता हूं, तो जो pid ​​दिखाता है वह अलग है, क्या यह सही है?
  3. क्या '$ $' मैक्रो जैसा कुछ है?

क्या आप मेरी मदद कर सकते हैं?


8
ध्यान दें कि getpidएक अलग प्रक्रिया आईडी दिखाएगा भले ही यह एक उपधारा में नहीं चलाया गया हो।
15

1
@ मेरियन echo $$ $BASHPID ; ( echo $$ $BASHPID )यह प्रदर्शित करता है कि यह करता है। गोल कोष्ठक एक उपधारा बनाते हैं। बयान परिवर्तनशील मान बदल सकते हैं, और मूल शेल को उन परिवर्तनों को नहीं देखना चाहिए। इसे एक fork()ऑपरेशन के रूप में लागू किया गया है ।
बेन

जवाबों:


222

$$एक उपधारा में माता-पिता की प्रक्रिया आईडी वापस करने के लिए परिभाषित किया गया है; "विशेष पैरामीटर" के तहत मैन पेज से:

$ शेल की प्रक्रिया आईडी में फैलता है। एक () उपधारा में, यह मौजूदा खोल की प्रक्रिया आईडी तक फैलता है, उपधारा नहीं।

में bash4, आप के साथ बच्चे की प्रक्रिया ID प्राप्त कर सकते हैं BASHPID

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634

16
"माता-पिता" थोड़ा भ्रामक है (कम से कम यह मेरे लिए था), यह वास्तव में "शीर्ष स्तर" खोल है। उदाहरण के लिए: echo $$; (echo $$; (echo $$))एक ही
पीड़ को

1
सही; मुझे यह कहना चाहिए था कि मूल्य एक मूल शेल से विरासत में मिला है (जो अपने माता-पिता आदि से इसका मूल्य विरासत में मिला है )। शीर्ष स्तर का खोल इसकी (गैर-शेल) मूल प्रक्रिया से विरासत के बजाय इसे शुरू में सेट करता है।
शेपनर

$ Expands to the process ID of the shellयह क्या है? echo $बस शाब्दिक $ echoes।
अलेक्जेंडर मिल्स

@AlexanderMills खैर, हाँ; $अकेले एक पैरामीटर विस्तार नहीं है। मैन पेज विशेष पैरामीटर के नाम का उल्लेख कर रहा है , जो है $; यह दावा नहीं है कि $अकेले फैलता है।
chepner

ठीक है मुझे ईमानदारी से पता नहीं है कि इसका क्या मतलब है, लेकिन echo $BASHPID4 और 5 में काम करता है (लेकिन MacOS पर 3.2.57 संस्करण नहीं)
अलेक्जेंडर मिल्स

81

आप निम्न में से किसी एक का उपयोग कर सकते हैं।

  • $! अंतिम पृष्ठभूमि वाली प्रक्रिया का PID है।
  • kill -0 $PID जांचें कि क्या यह अभी भी चल रहा है।
  • $$ वर्तमान शेल का पीआईडी ​​है।

2
kill -0 $!यदि हम पृष्ठभूमि प्रक्रियाओं के बारे में बात कर रहे हैं तो क्या दूसरी गोली नहीं होनी चाहिए ? PIDडिफ़ॉल्ट रूप से कुछ भी सेट नहीं है।
आइजैक फ्रीमैन

26
  1. कोष्ठक बैश में एक उप- आह्वान करते हैं । चूंकि यह केवल एक सबशेल है, इसमें एक ही पीआईडी ​​हो सकती है - कार्यान्वयन पर निर्भर करता है।
  2. आपके द्वारा आह्वान किया जाने वाला सी कार्यक्रम एक अलग प्रक्रिया है, जिसकी अपनी अनूठी पीआईडी ​​है - कोई बात नहीं अगर यह एक उप-संस्करण में है या नहीं।
  3. $$मौजूदा स्क्रिप्ट PID के लिए बैश में एक उपनाम है । बीच $$और $BASHPIDयहाँ अंतर देखें , और इसके ठीक ऊपर अतिरिक्त चर $BASH_SUBSHELLजिसमें नेस्टिंग स्तर होता है।

4

प्रयास करें getppid()यदि आप अपने सी कार्यक्रम अपने खोल के पीआईडी प्रिंट करना चाहते हैं।


2

यदि आप पूछ रहे थे कि किसी ज्ञात कमांड का पीआईडी ​​कैसे प्राप्त किया जाए तो यह कुछ इस तरह से होगा:

यदि आपने नीचे कमांड जारी की थी # जारी किया गया आदेश *** था

dd if = / dev / diskx of = / dev / disky


तब आप उपयोग करेंगे:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

यहाँ क्या होता है यह एक क्षेत्र के लिए आवश्यक सभी अद्वितीय पात्रों को पाइप करता है और उस क्षेत्र का उपयोग करके गूँज सकता है

इको $ पीआईडी


1

यह एक अचूक तरीका है जिससे आप सही पिड प्राप्त कर सकते हैं

pid=$(cut -d' ' -f4 < /proc/self/stat)

उप के लिए एक ही अच्छा काम किया

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

उत्पादन की जाँच करें

pid = 8099
8099 != 8100

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