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?
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.
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.
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
ps faux
untuk memeriksa tty / pts yang terkait dengan proses. jika tidak ada atau "?" mungkin hilang dalam kekosongan. (ini hanya sebuah ide, saya bisa salah)~/.xsession-errors
Jawaban:
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 metacity
ataupidof metacity
jika Metacity adalah window manager Anda - jika Anda tidak tahu nama proses untuk window manager Anda, lihat akar dari salah satu pohon proses yang dilaporkan olehps f
ataupstree
). Misalkan proses ID window manager Anda adalah 1234, jalankandan mencari baris yang sesuai dengan file deskriptor 1 dan 2, atau
atau
Anda dapat mengotomatiskan pemfilteran deskriptor file yang relevan:
(Catatan: semua perintah di atas adalah untuk Linux.
pgrep
Umum di antara berbagai unix lainnya, danlsof
dapat diinstal cukup banyak di mana saja;ps
opsi dan/proc
konten 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).
Banyak distribusi mengarahkan output dari sesi X ke
~/.xsession-errors
.sumber
pidof blackbox
ataupgrep blackbox
untuk mendapatkan PID dari manajer jendela, atau langsunglsof -p$(pidof blackbox)
. Mereka tidak ada hubungannya dengan ini.ls -l /proc/<blackbox-id>/fd
memberitahu saya bahwa stdout pergi ke/dev/null
dan stderr pergi ke~/.xsession-errors
.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-f1
berupa konsol keluaran untuk instance X danalt-ctrl-f7
merupakan 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.sumber
startx
atauxinit
secara langsung seseorang dapat selalu men~/.xinitrc
- tweak untuk melakukan pengalihan sesuai kebutuhan sebelum melakukanexec
window 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~/.xinitrc
ke~/.xinitrc.out
.Jika Anda mengambil yang biasanya satu program memulai yang lain dengan melakukan serangkaian
man 2 fork
danman 2 execve
kemudian 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
xmonad
manajer jendela) akan dimulaidmenu_run
dmenu_run
akan menangani input saya dan memulai beberapa aplikasi (mis.xkill
)Output akan menuju ke
/dev/tty1
karenaxkill
dimulai olehdmenu_run
dmenu_run
dimulai olehxmonad
xmonad
dimulai olehX
X
dimulai olehstartx
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
sumber