วิธีรับ tty ที่ bash ทำงานอยู่?


24

ในวิธีที่สองที่เสนอโดยหน้านี้วิธีหนึ่งได้รับ tty ซึ่ง bash กำลังถูกรันด้วยคำสั่ง:

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

ฉันคิดกับตัวเองว่านี่เป็นสิ่งที่ขี้เกียจนิดหน่อยโดยแสดงรายการกระบวนการทำงานทั้งหมดเพื่อดึงข้อมูลหนึ่ง มันจะไม่มีประสิทธิภาพมากกว่านี้หรือไม่

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

FYI ฉันเจอปัญหานี้เพราะบางครั้งคำสั่งแรกจะให้ผลลัพธ์สองบรรทัด (หรือมากกว่า) สิ่งนี้จะเกิดขึ้นแบบสุ่มเมื่อจะมีกระบวนการอื่นทำงานด้วย PID ที่มี$$เป็นสตริงย่อย ในแนวทางที่สองฉันกำลังหลีกเลี่ยงกรณีดังกล่าวโดยขอ PID ที่ฉันรู้ว่าฉันต้องการ


6
มีประสิทธิภาพมากที่สุดของทั้งหมดจะถูกเรียกใช้ttyคำสั่งในเซสชั่นทุบตีของคุณ หากคุณยืนยันในการใช้ ps-ps -p $$ -o tty=
iruvar

คำตอบ:


46

เพียงแค่พิมพ์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และหยุดบ่น :)
Sheljohn

คนแรกส่งกลับคุณยังptyเป็นกระบวนการที่ทำงานgrepในขณะที่คุณสามารถสังเกตเห็น
Jakuje

2
คุณไม่จำเป็นต้องถ้าคุณกำลังใช้grep awkเช่นps ax | awk "/^$$/ {print \$2}"- \$2ทราบการใช้ราคาสองครั้งมากกว่าคำพูดเดียวและหนี แต่อย่างที่คุณพูดการใช้ttyเป็นวิธีที่ถูกต้อง
cas

การทำ grepping เช่นนั้นอาจส่งผลให้เกิดการแข่งขันที่ผิดพลาดเช่นหาก PID ของคุณคือ 10 และยังมี PID 103 อีกด้วยการใช้งานawk -vpid=$$ '$1 == pid {print $2}'
Barmar

ฉันเพิ่งสังเกตที่นี่ว่าการวางไข่ttyใน node.js ไม่ทำงานเลยในขณะที่psและเพื่อนทำงานได้ดี
Steven Lu

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.

(หากคุณอยู่ในเชลล์ที่ stdin, stdout และ stderr ไม่ได้เชื่อมต่อกับเทอร์มินัลการควบคุมคุณสามารถรับไฟล์ filescriptor ไปยังเทอร์มินัลการควบคุมได้โดยเปิด/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ไม่ใช่การควบคุม tty (ตามที่รายงานโดยps) (2) ฉันเชื่อว่านั่น{ readlink /dev/fd/0; } < /dev/tty(และจะเสมอ) เทียบเท่ากับreadlink /dev/fd/0 < /dev/tty- คุณเชื่ออย่างอื่นหรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถปรับมันได้หรือไม่ (3) เซมิโคลอนที่สองในคำสั่งของคุณ (หลังจากนั้น/dev/tty) ไม่จำเป็น
สกอตต์

6

เพื่อความสมบูรณ์ในขณะที่คำสั่ง ps อื่น ๆ ที่กล่าวถึงทำงานบน Linux ps -p $$ -o tty=(ตามที่กล่าวถึงโดย @ 1_CR) เป็นแบบพกพาที่สุดสำหรับระบบ Unix ที่ทันสมัยเนื่องจากมันใช้ตัวเลือกที่กำหนดไว้ในมาตรฐาน Unixเท่านั้น


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.