จะทราบระดับของกระสุนที่ฉันอยู่ได้อย่างไร


32

ถ้าฉันเปิดเทอร์มินัลเหมือนxtermฉันจะมีเชลล์ ถ้าฉันใช้sshหรือzshฉันจะมีระดับ "เชลล์" อีกอัน มีวิธีรู้หรือไม่ว่าฉันต้องCtrl+Dพิมพ์กี่ครั้งexitเพื่อออกจากพวกเขาทั้งหมด? ความตั้งใจที่แท้จริงของฉันคือการออกจากทุกอย่างยกเว้นเปลือก "รูท"

นอกจากนี้ยังเป็นการดีที่จะรู้ว่าเอฟเฟกต์มัลติเพล็กเซอร์ (เช่นscreen) มีผลต่อการแก้ปัญหาอย่างไร

PS: โปรดเปลี่ยนชื่อฉันไม่ทราบว่าเป็นคำที่ถูกต้อง

คำตอบ:


6

วิธีหนึ่ง (เป็นที่ยอมรับว่าไม่สมบูรณ์แบบ) คือการเพิ่มผลลัพธ์ps --no-headers -o comm $PPIDให้กับเชลล์พรอมต์ของคุณ สิ่งนี้จะบอกชื่อกระบวนการที่เกิดขึ้นกับเชลล์ของคุณ หากคุณอยู่ใน zsh ซ้อนกันมันจะพูดว่า "zsh" หากคุณอยู่ในระดับ zsh ระดับสูงสุดมันจะอ่าน "xterm" หรือ "หน้าจอ" หรือสิ่งที่เปลือกของคุณทำงานอยู่

เพื่อบอกว่าคุณอยู่ในเซสชั่น ssh หรือ su คุณสามารถดูชื่อโฮสต์และชื่อผู้ใช้ในส่วนของพรอมต์ของคุณ

เมื่อคุณใช้งานหน้าจอแบบซ้อน (ซึ่งฉันไม่คิดว่าเป็นสถานการณ์ทั่วไป) ไม่มีทางที่ฉันจะบอกได้ว่าคุณอยู่ในระดับสูงสุดของหน้าจอแบบซ้อนกันหรือระดับบนสุด ของหน้าจอระดับบนสุด คุณสามารถกำหนดค่าหน้าจอให้แสดงบรรทัดสถานะได้เสมอซึ่งจะทำให้หลายสถานะแสดงหากคุณอยู่ในหน้าจอซ้อน


Aaah ... snap .. เอาชนะฉันไปเลย :) +1
Stefan

ขณะนี้ฉันใช้ mac และคำสั่งให้ps: illegal option -- -ความคิดอะไรกับฉัน ฉันจะทดสอบอีกครั้งในเร็ว ๆ นี้ :) ลินุกซ์
phunehehe

3
@phunehehe: --option-nameส่วนใหญ่เป็นคุณลักษณะเฉพาะของ GNU ดังนั้นส่วนใหญ่จึงไม่สามารถใช้งานได้ในยูทิลิตี้ระบบมาตรฐานนอก Linux แต่คุณสามารถรับผลกระทบของการps --no-headersพอร์ตได้โดยเพิ่ม=หลังจากชื่อคอลัมน์ นอกจากนี้commคอลัมน์ไม่ใช่ POSIX แต่cmdคอลัมน์ (ซึ่งรวมถึงอาร์กิวเมนต์ของคำสั่ง) คือ นอกจากนี้-pจำเป็นก่อน PID ในไวยากรณ์ POSIX ดังนั้นps -o cmd= -p $PPIDเป็นแบบพกพาและให้ข้อมูลที่คล้ายกัน
Gilles 'หยุดชั่วร้าย'

ยืนยันแล้วทำงานใน Gentoo
phunehehe

2
@phunehehe: ขอโทษฉันทำผิดพลาดในความคิดเห็นข้างต้น ในความเป็นจริงcommคอลัมน์จะถูกระบุโดย POSIX และบันทึกไว้ใน Mac OS X ในขณะที่cmdคอลัมน์นั้นมีอยู่บน Linux แต่ไม่ได้เป็นมาตรฐาน
Gilles 'หยุดความชั่วร้าย'

37

ในความเป็นจริงคุณมีคำที่ถูกต้อง¹ มีตัวแปรสภาพแวดล้อมSHLVLที่เชลล์เชิงโต้ตอบที่สำคัญทั้งหมด (bash, tcsh, zsh) เพิ่มขึ้น 1 เมื่อเริ่มต้น ดังนั้นถ้าคุณเริ่มเชลล์ภายในเชลล์ให้SHLVLเพิ่มขึ้น 1

อย่างไรก็ตามสิ่งนี้ไม่ได้ตอบข้อกังวลของคุณโดยตรงเนื่องจากSHLVLมีหลายสิ่งเช่นเทอร์มินัลอีมูเลเตอร์ ตัวอย่างเช่นในการกำหนดค่าทั่วไปของฉัน$SHLVLคือ 2 ใน xterm เนื่องจากระดับ 1 สอดคล้องกับเชลล์ที่รันเซสชัน X ของฉัน ( ~/.xinitrcหรือ~/.xsession)

สิ่งที่ฉันทำคือการแสดง$SHLVLในพรอมต์ของฉัน แต่ถ้ากระบวนการหลักของเปลือกหอยเป็นเปลือกอื่น (ด้วยการวิเคราะห์พฤติกรรมเช่น "ถ้าชื่อของมันจบลงด้วยshเครื่องหมายวรรคตอนและตัวเลขตัวเลือกมันเป็นเปลือก") ด้วยวิธีนี้ฉันมีตัวบ่งชี้ที่เห็นได้ชัดในกรณีที่ไม่ธรรมดาของเชลล์ที่ทำงานภายใต้เชลล์อื่น

บางทีคุณอาจต้องการตรวจจับเชลล์ที่รันโดยตรงภายใต้เทอร์มินัลอีมูเลเตอร์ คุณสามารถทำสิ่งนี้ได้อย่างถูกต้อง: เชลล์เหล่านี้มีกระบวนการพาเรนต์ที่มีเทอร์มินัลการควบคุมที่แตกต่างกันดังนั้นps -o tty= -p$$และps -o tty= -p$PPIDผลิตเอาต์พุตที่แตกต่างกัน คุณอาจรีเซ็ตSHLVLเป็น 1 ในเชลล์เหล่านี้ด้วยตนเองหรือตั้งค่าของคุณเองTERMSHLVLเป็น 1 ในเชลล์เหล่านี้ (และเพิ่มเป็นอย่างอื่น)

¹ ถึงแม้คนหนึ่งจะไม่คิดว่ามันดูที่หน้าคู่มือ: ไม่มีในสามของเปลือกหอยที่สนับสนุนมันรวมคำว่า“ระดับ” SHLVLในเอกสารของพวกเขา


ขอบคุณสำหรับการยืนยันคำศัพท์ ฉันยังอยู่ใน mac และประหลาดใจที่พบว่าคำสั่งทั้งสองนั้นให้ผลลัพธ์เหมือนกันโดยไม่คำนึงถึงระดับเชลล์ของฉัน
phunehehe

@phunehehe: คำสั่งอะไร 2 หากคุณหมายถึงps -o tty= -p$pidสิ่งนี้จะแสดงเทอร์มินัลการควบคุมของกระบวนการซึ่งระบุเทอร์มินัลอีมูเลเตอร์ (xterm, screen, sshd, …) ว่ากระบวนการกำลังทำงานอยู่มันจะไม่เปลี่ยนแปลงหากคุณเริ่มเชลล์จากเชลล์อื่น แต่จะเปลี่ยนหากคุณ เริ่มโปรแกรมจำลองเทอร์มินัลใหม่ หากเทอร์มินัลอีมูเลเตอร์เป็นแอปพลิเคชัน Mac ดั้งเดิมอาจมีความละเอียดเฉพาะของ Mac ที่ฉันไม่ทราบ
Gilles 'หยุดความชั่วร้าย'

ps -o tty= -p$$ และps -o tty= -p$PPID เพราะคุณบอกว่าพวกเขาควรสร้างผลลัพธ์ที่แตกต่างกัน หรือฉันเข้าใจผิดบางอย่าง?
phunehehe

@phunehehe: พวกเขาให้ผลลัพธ์ที่แตกต่างกันเมื่อกระบวนการหลักของเชลล์เป็นเทอร์มินัลอีมูเลเตอร์เพราะเทอร์มินัลอีมูเลเตอร์ไม่ได้มีเทอร์มินัลจำลองที่เป็นเทอร์มินัลควบคุม หากคุณพบเป็นอย่างอื่นโปรดโพสต์ผลลัพธ์ของps -p $$ -p $PPID(อีกครั้งฉันไม่มีประสบการณ์ OSX ดังนั้นอาจมีบางอย่างผิดปกติเกิดขึ้นใน OSX)
Gilles 'หยุดความชั่วร้าย'

@Gilles: นั่นเป็นสิ่งที่ผิดปกติกับ OSX ฉันทดสอบกับ Gentoo และทุกอย่างถูกต้องตามที่คุณพูด บน OSX ps -p $$ -p $PPIDให้ (ขออภัยฉันไม่รู้วิธีการจัดรูปแบบความคิดเห็น) PID TTY TIME CMD 209 ttys000 0: 00.01 เข้าสู่ระบบ -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe

1

ไม่หรูหรามากนัก แต่คุณสามารถใช้มุมมองแบบต้นไม้ในhtopเพื่อดูความสัมพันธ์ระหว่างพาเรนต์กับเชลล์ของคุณกับโปรแกรมที่รันอยู่อื่น ๆ

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

และใช้เพื่อสรุปจำนวนกระสุนที่คุณจะต้องออกก่อนที่จะเกิดขึ้นที่เปลือก "รูท"


1

คุณสามารถใช้ตัวแปรสภาพแวดล้อมSHLVL :

echo "$SHLVL"

1
หากคุณใช้sshเช่นบัญชีเดียวกันนี้จะยังคงอยู่1
Anthon

0

ฉันพบว่า

$ pstree -u | grep ${USER}

จะมีประโยชน์มากสำหรับการดูว่าฉัน "พอดีกับ" ในระบบ pstree -u ${USER}ฉันชอบมันมากกว่า

บางครั้งมันจะเตือนฉันว่าฉันออกจากnohupงานที่ทำงานหรือคล้ายกัน

(ฉันใช้alias grep='grep --color=auto'ด้วย)

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