इसके चलने से पहले ही आप कमांड का उपयोग कर सकते हैं sh -c
और exec
पीआईडी प्राप्त कर सकते हैं ।
शुरू करने के लिए myCommand
, ताकि उसका पीआईडी मुद्रित होने से पहले ही प्रिंट हो जाए, आप उपयोग कर सकते हैं:
sh -c 'echo $$; exec myCommand'
यह काम किस प्रकार करता है:
यह एक नया शेल शुरू करता है, उस शेल के PID को प्रिंट करता है, और फिर शेल को आपके कमांड के साथ बदलने के लिए exec
बिलिन का उपयोग करता है , यह सुनिश्चित करता है कि इसमें समान PID हो। जब आपका शेल बिल्टिन के साथ एक कमांड चलाता है , तो आपका शेल वास्तव में वह कमांड बन रहा है , न कि खुद की एक नई कॉपी को फोर्क करने के अधिक सामान्य व्यवहार से, जिसका अपना अलग पीआईडी है और जो तब कमांड बन जाता है।exec
मुझे लगता है कि यह अतुल्यकालिक निष्पादन (साथ &
), नौकरी पर नियंत्रण, या खोज के साथ जुड़े विकल्पों की तुलना में बहुत सरल है ps
। वे दृष्टिकोण ठीक हैं, लेकिन जब तक आपके पास उनका उपयोग करने के लिए एक विशिष्ट कारण नहीं है - उदाहरण के लिए, शायद कमांड पहले से ही चल रहा है, जिस स्थिति में उसके पीआईडी की खोज या नौकरी पर नियंत्रण का उपयोग करना समझ में आता है - मैं पहले इस तरह से विचार करने का सुझाव देता हूं। (और मैं निश्चित रूप से इसे प्राप्त करने के लिए एक जटिल स्क्रिप्ट या अन्य कार्यक्रम लिखने पर विचार नहीं करूंगा)।
इस उत्तर में इस तकनीक का एक उदाहरण शामिल है।
उस आदेश के कुछ हिस्सों को कभी-कभी छोड़ा जा सकता है, लेकिन आमतौर पर नहीं।
यहां तक कि अगर आप जिस शेल का उपयोग कर रहे हैं वह एक बॉर्न-शैली है और इस प्रकार exec
इन शब्दार्थों के साथ बिलिन का समर्थन करता है , तो आपको आमतौर पर इस उद्देश्य के लिए sh -c
एक नई, अलग शेल प्रक्रिया बनाने के लिए उपयोग (या समकक्ष) से बचने की कोशिश नहीं करनी चाहिए , क्योंकि:
- एक बार शेल बन
myCommand
जाने के बाद, बाद में कमांड चलाने के लिए कोई शेल नहीं है। sh -c 'echo $$; exec myCommand; foo
के foo
साथ खुद को बदलने के बाद चलाने का प्रयास करने में सक्षम नहीं होगा myCommand
। जब तक आप एक स्क्रिप्ट नहीं लिख रहे हैं जो इसे अपनी अंतिम कमांड के रूप में चलाती है, तो आप केवल echo $$; exec myCommand
एक शेल में उपयोग नहीं कर सकते हैं जहां आप अन्य कमांड चला रहे हैं।
- आप इसके लिए किसी सबशेल का उपयोग नहीं कर सकते ।
(echo $$; exec myCommand)
तुलनात्मक रूप से अच्छे हो सकते हैं sh -c 'echo $$; exec myCommand'
, लेकिन जब आप $$
अंदर भागते हैं (
)
, तो यह मूल शेल के PID को देता है, न कि उपधारा के। लेकिन यह सबशेल का PID है जो नए कमांड का PID होगा। कुछ शैल उप-पीआईडी खोजने के लिए अपने स्वयं के गैर-पोर्टेबल तंत्र प्रदान करते हैं, जिसे आप इसके लिए उपयोग कर सकते हैं। विशेष रूप से, बैश 4 में , (echo $BASHPID; exec myCommand)
काम करता है।
अंत में, ध्यान दें कि कुछ गोले एक ऑप्टिमाइज़ेशन करेंगे जहाँ वे एक कमांड चलाते हैं जैसे कि exec
(अर्थात, वे पहले फोर्किंग करते हैं) जब यह ज्ञात होता है कि शेल को बाद में कुछ भी करने की आवश्यकता नहीं होगी। कुछ गोले इसे कभी भी करने की कोशिश करते हैं, इसे चलाया जाना अंतिम आदेश है, जबकि अन्य केवल तभी करेंगे जब कमांड के पहले या बाद में कोई अन्य कमांड नहीं हैं, और अन्य इसे बिल्कुल नहीं करेंगे। प्रभाव अगर आपके लिखने के लिए भूल जाते हैं कि है exec
और बस का उपयोग sh -c 'echo $$; myCommand'
तो यह होगा कभी कभी पर आप सही पीआईडी देना कुछ के साथ सिस्टम कुछ गोले। मैं इस तरह के व्यवहार पर भरोसा करने के खिलाफ सलाह देता हूं , और इसके बजाय हमेशा exec
जब आप की आवश्यकता होती है तब शामिल करते हैं।