ผลลัพธ์จากแอปพลิเคชันเริ่มต้นจากตัวจัดการหน้าต่างไปที่ไหน


10

หากคุณเริ่มต้นแอปพลิเคชันจากเทอร์มินัลคุณสามารถเห็นเอาต์พุตไปยัง stdout และ stderr แต่หากแอปพลิเคชันเริ่มต้นจากตัวจัดการหน้าต่างโดยทั่วไปผลลัพธ์ไปยังไฟล์เหล่านี้ไปที่ใด ถึง / dev / null?


1
คำแนะนำ: ใช้ps fauxเพื่อตรวจสอบว่า tty / pts เชื่อมโยงกับกระบวนการใด ถ้าไม่มีหรือ "?" มันอาจหายไปในความว่างเปล่า (นี่เป็นเพียงความคิดที่ฉันสามารถทำผิด)
mveroone

@Kwaio: ค่าเป็นเครื่องหมายคำถาม (?) ดังนั้นอย่างที่คุณพูดมันอาจจะหายไปในความว่างเปล่า
สิงหาคม Karlstrom

2
หากคุณเริ่มเชลล์กราฟิกของคุณจาก gdm หรือ kdm เอาต์พุตสามารถพบได้ใน~/.xsession-errors
Shadur

คำตอบ:


8

เอาต์พุตของแอ็พพลิเคชันเริ่มต้นจากตัวจัดการหน้าต่างไปที่ตำแหน่งเดียวกับเอาต์พุตจากตัวจัดการหน้าต่างเอง (ยกเว้นว่าแอปพลิเคชันเปลี่ยนเส้นทาง แต่แอปพลิเคชั่น GUI ทั่วไปไม่สามารถทำได้)

คุณสามารถค้นหาว่าเอาต์พุตของ WM ไปที่ใดโดยดูจากสิ่งที่เปิดอยู่บน file descriptor 1 (เอาต์พุตมาตรฐาน) และ file descriptor 2 (ข้อผิดพลาดมาตรฐาน); โดยทั่วไปทั้งสองจะไปที่ไฟล์เดียวกัน ค้นหา ID กระบวนการของตัวจัดการหน้าต่างของคุณ (ลองเช่นpgrep metacityหรือpidof metacityถ้า Metacity เป็นตัวจัดการหน้าต่างของคุณ - หากคุณไม่ทราบชื่อกระบวนการสำหรับตัวจัดการหน้าต่างของคุณให้ดูที่รากของหนึ่งในแผนผังกระบวนการที่รายงานโดยps fหรือpstree) หากว่า ID กระบวนการของตัวจัดการหน้าต่างของคุณคือ 1234 ให้เรียกใช้

lsof -p1234

และค้นหาบรรทัดที่สัมพันธ์กับ file descriptors 1 และ 2 หรือ

หรือ

ls -l /proc/1234/fd

คุณสามารถทำการกรองไฟล์ descriptors ที่เกี่ยวข้องได้โดยอัตโนมัติ:

lsof -p1234 | awk '$4 ~ /^[12][^0-9]/'
ls -l /proc/1234/fd/[12]

(หมายเหตุ: คำสั่งทั้งหมดข้างต้นนั้นใช้สำหรับ Linux ซึ่งpgrepเป็นเรื่องทั่วไปในกลุ่ม Unices อื่น ๆ และlsofสามารถติดตั้งได้ทุกที่psตัวเลือกและ/procเนื้อหานั้นแตกต่างกันไปตามแต่ละ Unices)

ในสถานการณ์ทั่วไปที่คุณกำลังรันคำสั่งจากเชลล์ที่รันในเทอร์มินัลอีมูเลเตอร์ (xterm, konsole, gnome-terminal, ฯลฯ แต่ไม่ใช่เมื่อใช้ข้ามหน้าจอหรือ tmux) จากนั้นคุณสามารถตรวจสอบได้ว่าเอาต์พุตของเทอร์มินัลอีมูเลเตอร์ เกิดขึ้นเมื่อเทอร์มินัลอีมูเลเตอร์เป็นกระบวนการหลักของเชลล์ของคุณ สิ่งนี้ไม่ทำงานหากเทอร์มินัลอีมูเลเตอร์ทำงานด้วยสิทธิพิเศษเพิ่มเติมซึ่งเกิดขึ้นในบางระบบเพื่อให้เทอร์มินัลอีมูเลเตอร์เขียนไปยังรายชื่อผู้ใช้ที่ล็อกอิน (utmp)

lsof -p$PPID
ls -l /proc/$PPID/fd

กระจายหลายโดยตรงการส่งออกของเซสชั่น X ~/.xsession-errorsไป


ในกรณีของฉันลำดับชั้นของเด็กผู้ปกครองเริ่มต้นจาก WM เป็น blackbox <- lightdm <- lightdm <- init และ ttys ทั้งหมดมีค่า "?" ฉันเดาว่าผลลัพธ์จะไปไหน
สิงหาคม Karlstrom

@AugustKarlstrom แล้วpidof blackboxหรือpgrep blackboxที่จะได้รับ PID lsof -p$(pidof blackbox)ของผู้จัดการหน้าต่างหรือโดยตรง Ttys ไม่มีส่วนเกี่ยวข้องกับสิ่งนี้
Gilles 'หยุดความชั่วร้าย' ใน

1
อ่าแน่นอน คำสั่งที่ls -l /proc/<blackbox-id>/fdบอกว่าจะไป stdout /dev/nullและ stderr ~/.xsession-errorsไป
สิงหาคม Karlstrom

1

ตัวจัดการหน้าต่างคือลูกของเซิร์ฟเวอร์ X ดังนั้นผลลัพธ์และลูกของมันจะไปที่เดียวกับเซิร์ฟเวอร์ X

หากคุณเป็นผู้ใช้คนเดียวและคุณลงชื่อเข้าใช้แบบกราฟิกระบบบางระบบจะแทนที่อินสแตนซ์ของเซิร์ฟเวอร์ X จากคอนโซลเอาต์พุตหมายความว่าคุณสามารถเปลี่ยนเป็นVT นั้นและดูได้ โดยปกติแล้วการจัดเรียงมักจะalt-ctrl-f1เป็นคอนโซลเอาต์พุตสำหรับอินสแตนซ์ X และalt-ctrl-f7เป็นจอแสดงผล X แต่คุณสามารถตรวจสอบได้มากเท่าที่คุณต้องการ 6 รายการแรกมักจะวางไข่การเข้าสู่ระบบ แต่อาจมีมากกว่านั้นที่จะไม่ปรากฏและจะว่างเปล่าหรือมีเอาต์พุตแบบไพพ์ อาจมีเอาต์พุตบางส่วนจาก init อย่าสับสนกับเอาต์พุตจาก X ในประสบการณ์ของฉัน X และเด็ก ๆ จะเห่าจำนวนคำเตือนและข้อความจำนวนมากเสมอ (เกี่ยวกับฟอนต์ที่ขาดหายไป

หากคุณไม่เข้าสู่ระบบผ่านทาง GUI มันจะเป็นสิ่งที่ VT ที่คุณเริ่มต้น X ซึ่งเป็นปัญหาเนื่องจากคุณจะไม่เห็นจนกว่าคุณจะออก ผมเชื่อว่าการเข้าสู่ระบบ GUI ที่ XDM (เข้าสู่ระบบกราฟิก) /dev/tty7ทำงานเป็นกระบวนการที่ได้รับการยกเว้นความหมายมันสามารถส่งออกท่อ คุณสามารถเกินไป ( startx 1>&2> /dev/tty7) หากคุณมีสิทธิ์ superuser ที่ถูกต้อง


1
ในกรณีที่startxหรือxinitโดยตรงสามารถปรับแต่ง~/.xinitrcการเปลี่ยนเส้นทางตามที่จำเป็นก่อนที่จะทำexecในการจัดการหน้าต่างที่ต้องการ ตัวฉันเองฉันไม่เคยพลาดงานประเภทนี้เลย หากฉันสนใจว่าแอปพลิเคชัน GUI ใดที่กำลังผลิตฉันเรียกใช้จากเทอร์มินัล แต่จริงๆแล้วมันอาจมีประโยชน์ดังนั้นฉันจึงเปลี่ยนเส้นทาง stdout และ stderr จาก~/.xinitrcไป~/.xinitrc.outเป็น
Miroslav Koškár

0

หากคุณทำเช่นนั้นโดยทั่วไปโปรแกรมหนึ่งจะเริ่มต้นด้วยการทำซีรีย์man 2 forkและman 2 execveจากนั้นในกระบวนการนั้นโดยตัวอธิบายไฟล์เริ่มต้นจะยังคงเปิดอยู่

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

ตัวอย่างเช่นในกรณีของฉัน

  • กด Ctrl + P (จัดการโดยตัวจัดการxmonadหน้าต่าง) จะเริ่มขึ้นdmenu_run
  • dmenu_runจะจัดการอินพุตของฉันและเริ่มแอปพลิเคชันบางอย่าง (เช่นxkill)

ผลลัพธ์จะเป็น/dev/tty1เพราะ

  • xkill เริ่มโดย dmenu_run
  • dmenu_run เริ่มโดย xmonad
  • xmonad เริ่มโดย X
  • X เริ่มโดย startx
  • startx เริ่มต้นโดยฉันด้วยตนเองจากคอนโซลเสมือนแรก /dev/tty1

สำหรับการอ้างอิงถ้าคุณต้องการค้นหาว่าเอาต์พุต / ข้อผิดพลาดไปที่ใดหรือดีกว่าบอกว่าไฟล์ descriptor ใดบ้างที่เปิดสำหรับกระบวนการเฉพาะ (ด้วย PID ที่รู้จัก)

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