जिस बैश में बाटी चल रही है, उसे कैसे प्राप्त करें?


25

इस पृष्ठ द्वारा प्रस्तावित दूसरी विधि में , उस व्यक्ति को ट्टी मिलती है जिसमें कमांड के साथ बैश चलाया जा रहा है:

ps ax | grep $$ | awk '{ print $2 }'

हालांकि मुझे खुद से लगता है कि निश्चित रूप से यह थोड़ा आलसी है, केवल सभी प्रक्रियाओं को सूचीबद्ध करने के लिए उनमें से एक को निकालने के लिए। क्या यह अधिक कुशल नहीं होगा (मैं यह भी पूछ रहा हूं कि क्या यह अवांछित प्रभाव शुरू करेगा):

ps -p $$ | tail -n 1 | awk '{ print $2 }'

FYI करें, मैं इस मुद्दे पर आया क्योंकि कभी-कभी पहली कमांड वास्तव में दो (या अधिक) लाइनों का उत्पादन करेगी। यह बेतरतीब ढंग से होगा, जब एक पीआईडी ​​के साथ चलने वाली एक और प्रक्रिया होगी जिसमें $$एक विकल्प के रूप में शामिल है । दूसरे दृष्टिकोण में, मैं पीआईडी ​​से अनुरोध करके ऐसे मामलों से बच रहा हूं जो मुझे पता है कि मुझे चाहिए।


6
अच्छी तरह से सभी के सबसे कुशल ttyअपने चलाए सत्र के भीतर कमांड चलाया जाएगा । यदि आप उपयोग करने पर जोर देते हैं ps-ps -p $$ -o tty=
iruvar

जवाबों:


47

बस टाइप करके tty:

$ tty 
/dev/pts/20

बहुत सरल और स्पष्ट होना :)

संपादित करें: पहली बार जब आप नोटिस कर सकते हैं, तो आप ptyचल रही प्रक्रिया की भी वापसी grepकरेंगे:

$ ps ax | grep $$
28295 pts/20   Ss     0:00 /bin/bash
29786 pts/20   S+     0:00 grep --color=auto 28295

इसलिए आपको केवल एक परिणाम पाने के लिए grep को फ़िल्टर करना होगा, जो बदसूरत हो रहा है:

ps ax | grep $$ | grep -v grep | awk '{ print $2 }'

या उपयोग कर रहा है

ps ax | grep "^$$" | awk '{ print $2 }'

(एक अधिक समझदार संस्करण)


हां, यह वास्तव में पहला सुझाया गया समाधान है (वास्तव में यह है tty | sed -e "s:/dev/::")। लेकिन मुझे लगता है कि उस पृष्ठ पर दूसरा सुझाया गया समाधान न केवल अक्षम है, बल्कि गलत भी है! ttyहालांकि मैं शिकायत करना बंद कर दूंगा । :)
शेलजोहन

पहले एक आप जो भी ptyप्रक्रिया चल रही grepहै उसे वापस कर सकते हैं जैसा कि आप देख सकते हैं।
जकूजी

2
grepयदि आप उपयोग कर रहे हैं तो आपको इसकी आवश्यकता नहीं है awk। उदाहरण ps ax | awk "/^$$/ {print \$2}"- सिंगल-कोट्स के बजाय डबल-कोट्स के उपयोग पर ध्यान दें और बच गए \$2। लेकिन, जैसा कि आप कहते हैं, का उपयोग ttyकरना सही समाधान है।
कैस

इस तरह के झूठे मैचों का परिणाम हो सकता है, जैसे कि यदि आपका पीआईडी ​​10 है और पीआईडी ​​103 भी है। उपयोगawk -vpid=$$ '$1 == pid {print $2}'
बरमार

मैं यहाँ सिर्फ इस बात पर ध्यान दे रहा हूँ कि ttyनोड.जेएस में स्पॉनिंग बिल्कुल भी काम नहीं करता है, जबकि psदोस्त ठीक काम करते हैं।
स्टीवन लू

17

यदि आप अधिक कुशल होना चाहते हैं, तो हाँ, आप सही हैं कि psप्रश्न में सिर्फ प्रक्रिया को फ़िल्टर कर सकते हैं (और यह अधिक सही होगा, कमांड लेने का जोखिम नहीं चल रहा है, जो आपके नाम में आपकी प्रक्रिया संख्या है )। इतना ही नहीं, लेकिन यह हेडर (विकल्प h) उत्पन्न करने, tailप्रक्रिया को समाप्त करने, और केवल TTYफ़ील्ड (विकल्प o tty) को प्रदर्शित करने, प्रक्रिया को समाप्त करने के लिए नहीं कहा जा सकता awkहै।

तो यहाँ आपके कम आदेश है:

ps hotty $$

10

इसे करने के अन्य तरीके:

readlink /dev/fd/0     #or 1 or 2 
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.

(यदि आप एक ऐसे शेल में हैं, जिसका स्टडआउट, स्टडआउट और स्टेडर इसके कंट्रोलिंग टर्मिनल से नहीं जुड़े हैं, तो आप कंट्रोलिंग टर्मिनल के लिए एक फाइलस्क्रिप्ट को खोलकर प्राप्त कर सकते हैं /dev/tty:

( { readlink /dev/fd/0; } </dev/tty; ) </dev/null  >output 2>&1

)

या साथ ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$

2
(1) मुझे खुशी है कि आपने महसूस किया है कि किसी प्रक्रिया का वर्तमान / नियंत्रण tty किसी फ़ाइल डिस्क्रिप्टर से संबद्ध नहीं है, और किसी भी fd पर खुले रहने की गारंटी नहीं है। लेकिन, क्या आपने उस आकस्मिकता के लिए वर्कअराउंड के रूप में पेश की गई कमांड की कोशिश की? जब मैं इसकी कोशिश करता हूं, तो मुझे जो कुछ भी मिलता है /dev/tty, वह नियंत्रित नहीं होता है (जैसा कि रिपोर्ट किया गया है ps)। (२) मेरा मानना ​​है कि - { readlink /dev/fd/0; } < /dev/tty(और हमेशा रहेगा) के बराबर readlink /dev/fd/0 < /dev/tty- क्या आप विश्वास करते हैं? यदि हां, तो क्या आप इसे सही ठहरा सकते हैं? (३) आपकी आज्ञा में दूसरा अर्धविराम (एक के बाद एक /dev/tty) अनावश्यक है।
स्कॉट

6

पूर्णता के लिए, जबकि अन्य पीएस कमांड लिनक्स पर काम का उल्लेख करते हैं, ps -p $$ -o tty=(जैसा कि @ 1_CR द्वारा उल्लेख किया गया है) सभी आधुनिक यूनिक्स प्रणालियों के लिए सबसे पोर्टेबल है, क्योंकि यह यूनिक्स मानक में परिभाषित केवल विकल्पों का उपयोग करता है ।


2

इंटरेक्टिव शेल में, कोई भी इसके लिए wकमांड का उपयोग कर सकता है। उदाहरण बलो में, wरिपोर्ट विशिष्ट उपयोगकर्ता द्वारा ही चलाई जा रही है, और निश्चित रूप से यह TTY से पता चलता है कि उस कमांड को कहाँ चलाया जा रहा है।

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               11:15   ?xdm?   1:47   0.34s init --user
xieerqi  pts/0    :0               11:18   23.00s  0.05s  0.05s /bin/mksh
xieerqi  pts/10   :0               11:20    0.00s  0.03s  0.01s w
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.