หากคุณเริ่มต้นแอปพลิเคชันจากเทอร์มินัลคุณสามารถเห็นเอาต์พุตไปยัง stdout และ stderr แต่หากแอปพลิเคชันเริ่มต้นจากตัวจัดการหน้าต่างโดยทั่วไปผลลัพธ์ไปยังไฟล์เหล่านี้ไปที่ใด ถึง / dev / null?
~/.xsession-errors
หากคุณเริ่มต้นแอปพลิเคชันจากเทอร์มินัลคุณสามารถเห็นเอาต์พุตไปยัง stdout และ stderr แต่หากแอปพลิเคชันเริ่มต้นจากตัวจัดการหน้าต่างโดยทั่วไปผลลัพธ์ไปยังไฟล์เหล่านี้ไปที่ใด ถึง / dev / null?
~/.xsession-errors
คำตอบ:
เอาต์พุตของแอ็พพลิเคชันเริ่มต้นจากตัวจัดการหน้าต่างไปที่ตำแหน่งเดียวกับเอาต์พุตจากตัวจัดการหน้าต่างเอง (ยกเว้นว่าแอปพลิเคชันเปลี่ยนเส้นทาง แต่แอปพลิเคชั่น 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
ไป
pidof blackbox
หรือpgrep blackbox
ที่จะได้รับ PID lsof -p$(pidof blackbox)
ของผู้จัดการหน้าต่างหรือโดยตรง Ttys ไม่มีส่วนเกี่ยวข้องกับสิ่งนี้
ls -l /proc/<blackbox-id>/fd
บอกว่าจะไป stdout /dev/null
และ stderr ~/.xsession-errors
ไป
ตัวจัดการหน้าต่างคือลูกของเซิร์ฟเวอร์ 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 ที่ถูกต้อง
startx
หรือxinit
โดยตรงสามารถปรับแต่ง~/.xinitrc
การเปลี่ยนเส้นทางตามที่จำเป็นก่อนที่จะทำexec
ในการจัดการหน้าต่างที่ต้องการ ตัวฉันเองฉันไม่เคยพลาดงานประเภทนี้เลย หากฉันสนใจว่าแอปพลิเคชัน GUI ใดที่กำลังผลิตฉันเรียกใช้จากเทอร์มินัล แต่จริงๆแล้วมันอาจมีประโยชน์ดังนั้นฉันจึงเปลี่ยนเส้นทาง stdout และ stderr จาก~/.xinitrc
ไป~/.xinitrc.out
เป็น
หากคุณทำเช่นนั้นโดยทั่วไปโปรแกรมหนึ่งจะเริ่มต้นด้วยการทำซีรีย์man 2 fork
และman 2 execve
จากนั้นในกระบวนการนั้นโดยตัวอธิบายไฟล์เริ่มต้นจะยังคงเปิดอยู่
ดังนั้นคำตอบก็คือโดยทั่วไปแล้วเอาต์พุต / ข้อผิดพลาดจะไปที่ตำแหน่งผลลัพธ์ของกระบวนการ / ข้อผิดพลาดของผู้ปกครองชี้ไปที่เวลาแยก (เว้นแต่โปรแกรมหลักจะเปลี่ยนเส้นทางบางส่วนของหลักสูตร) ฉันคิดว่าคุณไม่สามารถเรียกร้องอะไรที่เฉพาะเจาะจงกว่านี้ได้หากเราไม่ทราบชื่อของโปรแกรมหลักอย่างแน่นอน กระบวนการตัวจัดการหน้าต่างไม่ค่อยเกี่ยวข้องกับการเปิดตัวโปรแกรมอื่น ๆ โดยตรง
ตัวอย่างเช่นในกรณีของฉัน
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
ps faux
เพื่อตรวจสอบว่า tty / pts เชื่อมโยงกับกระบวนการใด ถ้าไม่มีหรือ "?" มันอาจหายไปในความว่างเปล่า (นี่เป็นเพียงความคิดที่ฉันสามารถทำผิด)