कैसे एक लिनक्स / यूनिक्स बैश स्क्रिप्ट अपने स्वयं के पीआईडी ​​को जानता है?


149

मेरे पास बैश में एक स्क्रिप्ट है Script.sh, और उसे खुद की PID (यानी मुझे Script.sh के अंदर PID प्राप्त करने की आवश्यकता है) जानना होगा

कोई आईडिया कि इसे कैसे किया जाए ?

जवाबों:



65

उपयोग $BASHPIDया$$

अधिक जानकारी के लिए मैनुअल देखें , जिसमें दोनों के बीच अंतर शामिल है।

टी एल; DRTFM

  • $$ खोल की प्रक्रिया आईडी के लिए फैलता है।
    • एक ()सबशेल में, यह इनवॉइसिंग शेल की प्रक्रिया आईडी तक फैलता है, न कि सब-शेल।
  • $BASHPID मौजूदा बैश प्रक्रिया की प्रक्रिया आईडी का विस्तार करता है।
    • एक ()सबशेल में, यह सबशेल की प्रक्रिया आईडी तक फैलता है

10
ध्यान दें कि $$ और BASHPID हमेशा एक ही चीज नहीं होती हैं - मैनुअल इसका उल्लेख करता है, और यहाँ एक और अधिक ठोस उदाहरण है: tldp.org/LDP/abs/html/internalvariables.html । अंतर बहुत महत्वपूर्ण हो सकता है, क्योंकि बहुत सारे बश निर्माण उप-श्रेणियों में चलते हैं।
कास्कैबेल

@ जेफ्रोमी - विख्यात। यही कारण था कि मैं मैनुअल से जुड़ा था।
tvanfosson

2
यह ध्यान दिया जाना चाहिए कि $BASHPIDBASH 4 के लिए नया है। यदि आप BASH 3.x का उपयोग कर रहे हैं, तो आपको उपयोग करना होगा$$
ब्रूनो ब्रोंस्की

36

जेफ्रोमी द्वारा संदर्भित एडवांस बैश स्क्रिप्टिंग गाइड में दिए गए उदाहरण के अलावा , इन उदाहरणों से पता चलता है कि पाइप कैसे सबस्क्रिप्शन बनाते हैं:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

क्या आप बता सकते हैं कि "<<<" का क्या अर्थ है? धन्यवाद।
सिल्पाजो डी एरियेरेज़

4
यह एक स्ट्रिंग को लूप (या जो कुछ भी पढ़ता है stdin) में रीडायरेक्ट करता है । स्ट्रिंग को "यहां स्ट्रिंग" कहा जाता है।
अगली सूचना तक रोक दिया गया।

8

पीआईडी ​​में संग्रहीत किया जाता है $$

उदाहरण: kill -9 $$यह कहा जाता है शेल उदाहरण को मार देगा।


kill -9( -9ध्वज के साथ ) को हानिकारक माना जाता है और इसका उपयोग केवल तभी किया जाता है यदि यह बिल्कुल आवश्यक हो)।
विलेम वैन ओन्सेम

3
इसे "खतरनाक" माना जाता है क्योंकि प्रक्रिया को सिग्नल का जवाब देने का मौका नहीं मिलता है (और संभवतः बाद में खुद को साफ कर लें)। करना kill -9 $$बिल्कुल 1 काम करता है। यह वर्तमान शेल प्रक्रिया को मारता है । यह उपयोगी है यदि आपने शेल सत्र में कुछ किया है जिसे आप .bash_historydocker run -e PASSWORD=hunter2 ircbot
लिखना


0

यदि प्रक्रिया एक बाल प्रक्रिया है और $ BASHPID सेट नहीं है, तो चल रही प्रक्रिया की बनाई गई बाल प्रक्रिया के ppid को क्वेरी करना संभव है। यह थोड़ा बदसूरत हो सकता है, लेकिन यह काम करता है। उदाहरण:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.