Di mana output dari aplikasi dimulai dari window manager pergi?

10

Jika Anda memulai aplikasi dari terminal, Anda dapat melihat output ke stdout dan stderr, tetapi jika aplikasi dimulai dari window manager, ke mana output ke file-file ini biasanya pergi? Ke / dev / null?

August Karlstrom
sumber
1
Saran: gunakan ps fauxuntuk memeriksa tty / pts yang terkait dengan proses. jika tidak ada atau "?" mungkin hilang dalam kekosongan. (ini hanya sebuah ide, saya bisa salah)
mveroone
@ Kwaio: Nilainya adalah tanda tanya (?) Jadi, seperti yang Anda katakan, mungkin hilang dalam kekosongan.
Agustus Karlstrom
2
Jika Anda memulai shell grafis Anda dari gdm atau kdm, hasilnya dapat ditemukan di~/.xsession-errors
Shadur

Jawaban:

8

Output dari aplikasi yang dimulai dari window manager pergi ke tempat yang sama dengan output dari window manager itu sendiri. (Kecuali jika aplikasi mengalihkannya, tetapi aplikasi GUI tipikal tidak.)

Anda dapat mengetahui di mana output WM berjalan dengan melihat apa yang telah dibuka pada file descriptor 1 (output standar) dan file descriptor 2 (standard error); biasanya keduanya akan menuju ke file yang sama. Cari tahu ID proses window manager Anda (coba misal pgrep metacityatau pidof metacityjika Metacity adalah window manager Anda - jika Anda tidak tahu nama proses untuk window manager Anda, lihat akar dari salah satu pohon proses yang dilaporkan oleh ps fatau pstree). Misalkan proses ID window manager Anda adalah 1234, jalankan

lsof -p1234

dan mencari baris yang sesuai dengan file deskriptor 1 dan 2, atau

atau

ls -l /proc/1234/fd

Anda dapat mengotomatiskan pemfilteran deskriptor file yang relevan:

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

(Catatan: semua perintah di atas adalah untuk Linux. pgrepUmum di antara berbagai unix lainnya, dan lsofdapat diinstal cukup banyak di mana saja; psopsi dan /prockonten berbeda di seluruh unix yang berbeda.)

Dalam situasi umum di mana Anda menjalankan perintah dari shell yang berjalan di emulator terminal (xterm, konsole, gnome-terminal, dll., Tetapi tidak ketika digunakan di layar atau tmux), maka Anda dapat dengan mudah memeriksa di mana output emulator terminal keluaran sedang berjalan, karena emulator terminal adalah proses induk dari shell Anda. Ini tidak berfungsi jika emulator terminal berjalan dengan hak istimewa tambahan, yang terjadi pada beberapa sistem untuk memungkinkan emulator terminal untuk menulis ke daftar pengguna yang masuk (utmp).

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

Banyak distribusi mengarahkan output dari sesi X ke ~/.xsession-errors.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Dalam kasus saya hierarki anak-orangtua yang dimulai dari WM adalah kotak hitam <- lightdm <- lightdm <- init dan semua ttys memiliki nilai "?". Saya kira kemudian bahwa hasilnya tidak ke mana-mana.
August Karlstrom
@ AgugKarlstrom Lalu pidof blackboxatau pgrep blackboxuntuk mendapatkan PID dari manajer jendela, atau langsung lsof -p$(pidof blackbox). Mereka tidak ada hubungannya dengan ini.
Gilles 'SANGAT berhenti menjadi jahat'
1
Ah, tentu saja. Perintah ls -l /proc/<blackbox-id>/fdmemberitahu saya bahwa stdout pergi ke /dev/nulldan stderr pergi ke ~/.xsession-errors.
August Karlstrom
1

Manajer jendela adalah anak dari server X, sehingga output dan anak-anaknya pergi ke tempat yang sama dengan server X.

Jika Anda adalah satu-satunya pengguna dan Anda masuk secara grafis, beberapa sistem memindahkan instance X server dari konsol keluaran, artinya Anda dapat beralih ke VT itu dan melihatnya. Secara anekdot, pengaturannya biasanya alt-ctrl-f1berupa konsol keluaran untuk instance X dan alt-ctrl-f7merupakan tampilan X, tetapi Anda dapat memeriksa sebanyak yang Anda bisa temukan. 6 yang pertama biasanya memunculkan login, tetapi ada kemungkinan lebih banyak yang tidak dan akan tampak kosong atau dengan output yang disalurkan. Mungkin ada output pada beberapa dari mereka dari init, jangan bingung dengan output dari X. Dalam pengalaman saya X dan anak-anak selalu menggonggong sejumlah besar peringatan dan pesan (tentang font yang hilang, panggilan yang terdepresiasi, dll).

Jika Anda tidak masuk melalui GUI, itu akan menjadi VT apa pun yang Anda mulai dari X, yang merupakan masalah karena Anda tidak akan melihatnya sampai Anda berhenti. Saya percaya dengan login GUI, XDM (login grafis) berjalan sebagai proses istimewa, artinya dapat mem-pipe output /dev/tty7. Anda juga dapat ( startx 1>&2> /dev/tty7) jika memiliki hak superuser yang tepat.

goldilocks
sumber
1
Dalam hal startxatau xinitsecara langsung seseorang dapat selalu men ~/.xinitrc- tweak untuk melakukan pengalihan sesuai kebutuhan sebelum melakukan execwindow manager yang diinginkan. Saya sendiri tidak pernah melewatkan hasil seperti ini. Jika saya tertarik dengan aplikasi GUI yang diproduksi, saya menjalankannya dari terminal. Tapi sebenarnya ini mungkin bisa membantu, jadi saya sudah mengarahkan ulang stdout dan stderr ~/.xinitrcke ~/.xinitrc.out.
Miroslav Koškár
0

Jika Anda mengambil yang biasanya satu program memulai yang lain dengan melakukan serangkaian man 2 forkdan man 2 execvekemudian dalam proses itu oleh deskriptor file default tetap terbuka.

Jadi jawabannya adalah bahwa biasanya output / kesalahan terjadi ketika proses / kesalahan orangtua menunjuk pada waktu fork (kecuali program induk melakukan beberapa pengalihan tentu saja). Saya pikir Anda tidak dapat mengklaim sesuatu yang lebih spesifik kecuali kami tahu persis nama program induknya. Proses window manager jarang terlibat dalam meluncurkan program lain secara langsung.

Misalnya dalam kasus saya

  • menekan Ctrl + P (ditangani oleh xmonadmanajer jendela) akan dimulaidmenu_run
  • dmenu_runakan menangani input saya dan memulai beberapa aplikasi (mis. xkill)

Output akan menuju ke /dev/tty1karena

  • xkill dimulai oleh dmenu_run
  • dmenu_run dimulai oleh xmonad
  • xmonad dimulai oleh X
  • X dimulai oleh startx
  • startx dimulai oleh saya secara manual dari konsol virtual pertama /dev/tty1

Hanya untuk referensi, jika Anda ingin menemukan di mana output / error terjadi, atau lebih baik katakan apa file deskriptor dibuka untuk proses tertentu (dengan PID yang dikenal), lakukan

$ lsof -p PID
Miroslav Koškár
sumber