पीएस कमांड और grep


8

प्रक्रिया सूची में कमांड क्यों ps -ef | grep $$दिखाता है grep? अपने कार्य को पूरा grepकरने के बाद निष्पादित नहीं किया psजाता है?


इसे पाइपलाइन कहा जाता है ...
Ipor Sircer

यदि यह पहली कमांड समाप्त होने तक प्रतीक्षा करता है, तो पाइपलाइनें उन कमांड के साथ कैसे काम करेंगी जो अपने आप बंद नहीं होते हैं, जैसे tail -f filename | grep pattern?
बमर

जवाबों:


11

जब पाइपिंग कमांड होते हैं, तो सभी प्रक्रियाएं एक ही समय में शुरू हो जाती हैं और वे सिर्फ तब तक सोते हैं (ब्लॉक) जब तक कि मैं / ओ उन्हें प्रवेश / बाहर नहीं कर देता। शेल आउटपुट को बफर नहीं करता है और इसे तब तक होल्ड करता है जब तक कि एक प्रक्रिया पूरी नहीं हो जाती है और फिर इसे दूसरी प्रक्रिया में स्थानांतरित कर देता है।

उदाहरण के लिए:

mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep bar

का परिणाम:

mtak 28813 28799  0 12:35 pts/17   00:00:00 tar -zcvf test.tgz /lib/
mtak 28814 28799  0 12:35 pts/17   00:00:00 grep --color=auto bla
mtak 28815 28799  0 12:35 pts/17   00:00:00 grep --color=auto foo
mtak 28816 28799  0 12:35 pts/17   00:00:00 grep --color=auto bar

आप grep प्रक्रिया की स्थिति को / proc ट्री में देख सकते हैं:

mtak@rubiks:~$ grep State /proc/28814/status
State:  S (sleeping)

आप यह भी देख सकते हैं कि दोनों greps एक ही पाइपलाइन (id 57573438) 1से जुड़े हैं और पहली प्रक्रिया का STDOUT ( ) 0दूसरी प्रक्रिया के STDIN ( ) से जुड़ा है ।

root@rubiks:~# ls -l /proc/28815/fd
total 0
lr-x------ 1 mtak mtak 64 dec  1 12:35 0 -> pipe:[57573437]
l-wx------ 1 mtak mtak 64 dec  1 12:35 1 -> pipe:[57573438]
lrwx------ 1 mtak mtak 64 dec  1 12:35 2 -> /dev/pts/17

root@rubiks:~# ls -l /proc/28816/fd
total 0
lr-x------ 1 mtak mtak 64 dec  1 12:35 0 -> pipe:[57573438]
lrwx------ 1 mtak mtak 64 dec  1 12:35 1 -> /dev/pts/17
lrwx------ 1 mtak mtak 64 dec  1 12:35 2 -> /dev/pts/17

हालांकि यह कहने के लिए कि वे सोते हैं और फिर नींद की कमान 'कॉस' में डालते हैं, यह एक जटिल उदाहरण का एक सा है, तो जब यह कहता है कि यह आपकी नींद की कमान है तो शेल द्वारा किया जा रहा है
बार्लोप

मैं बस नींद की कमान में कुछ देरी का परिचय देता हूं ताकि मैं सिस्टम पर चारों ओर देख सकूं। स्लीप कमांड उसके पीछे grep को प्रभावित नहीं करता है, सिवाय इसके कि grep को कोई इनपुट प्राप्त नहीं होता है। यदि यह आपको खुश करता है, तो आप टार के साथ भी ऐसा कर सकते हैं: $ tar -zcvf test.tgz /lib/ | grep foo | grep barऔर फिर grep की जांच करें:$ cat status Name: grep State: S (sleeping)
mtak

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