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?
~/.xsession-errors
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?
~/.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
atau pidof 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 oleh ps f
atau 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. pgrep
Umum di antara berbagai unix lainnya, dan lsof
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).
lsof -p$PPID
ls -l /proc/$PPID/fd
Banyak distribusi mengarahkan output dari sesi X ke ~/.xsession-errors
.
pidof blackbox
atau pgrep blackbox
untuk mendapatkan PID dari manajer jendela, atau langsung lsof -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 dan alt-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.
startx
atau xinit
secara langsung seseorang dapat selalu men ~/.xinitrc
- tweak untuk melakukan pengalihan sesuai kebutuhan sebelum melakukan exec
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
dan man 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
karena
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
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)