Bir terminalden bir uygulama başlatırsanız stdout ve stderr çıktısını görebilirsiniz, ancak pencere yöneticisinden bir uygulama başlatılırsa, bu dosyalara çıktı genellikle nereye gider? / Dev / null?
~/.xsession-errors
Bir terminalden bir uygulama başlatırsanız stdout ve stderr çıktısını görebilirsiniz, ancak pencere yöneticisinden bir uygulama başlatılırsa, bu dosyalara çıktı genellikle nereye gider? / Dev / null?
~/.xsession-errors
Yanıtlar:
Pencere yöneticisinden başlatılan bir uygulamanın çıktısı, pencere yöneticisinin çıktısıyla aynı yere gider. (Uygulama yönlendirmediği sürece, ancak tipik GUI uygulamaları desteklemez.)
Dosya tanıtıcı 1 (standart çıktı) ve dosya tanıtıcı 2 (standart hata) üzerinde açık olanlara bakarak WM'nin çıktısının nereye gittiğini öğrenebilirsiniz; genellikle her ikisi de aynı dosyaya gider. Pencere yönetici süreci kimliğini bulun (deneyin örneğin pgrep metacity
ya pidof metacity
- Eğer pencere yöneticisi için işlem adını bilmiyorsanız, süreç ağaçlardan birinin kökünde görünüm tarafından bildirilen Metacity sizin pencere yöneticisi ise ps f
ya pstree
). Pencere yöneticinizin işlem kimliğinin 1234 olduğunu varsayalım, çalıştırın
lsof -p1234
ve dosya tanımlayıcıları 1 ve 2'ye karşılık gelen satırları arayın veya
veya
ls -l /proc/1234/fd
İlgili dosya tanımlayıcılarının filtrelenmesini otomatikleştirebilirsiniz:
lsof -p1234 | awk '$4 ~ /^[12][^0-9]/'
ls -l /proc/1234/fd/[12]
(Not: yukarıdaki tüm komutlar Linux içindir. pgrep
Diğer unices arasında yaygındır ve lsof
hemen hemen her yere kurulabilir; ps
seçenekler ve /proc
içerikler farklı unices arasında farklıdır.)
Bir terminal öykünücüsünde (xterm, konsole, gnome terminali vb.) Çalışan bir kabuktan komut çalıştırdığınız genel durumda (ekran veya tmux arasında kullanıldığında değil), terminal öykünücüsünün çıktısının nerede olduğunu kolayca kontrol edebilirsiniz. Terminal öykünücüsü kabuğunuzun ana işlemi olduğu için gidiyor. Terminal öykünücüsü, bazı sistemlerde terminal öykünücüsünün oturum açmış kullanıcı listesine (utmp) yazmasına izin vermek için gerçekleşen ek ayrıcalıklarla çalışıyorsa bu çalışmaz.
lsof -p$PPID
ls -l /proc/$PPID/fd
Birçok dağıtım X oturumunun çıktısını yönlendirir ~/.xsession-errors
.
pidof blackbox
veya pgrep blackbox
pencere yöneticisinin PID'sini almak için veya doğrudan lsof -p$(pidof blackbox)
. Ttys'in bununla hiçbir ilgisi yok.
ls -l /proc/<blackbox-id>/fd
bana stdout'un gittiğini /dev/null
ve stderr'ın gittiğini söylüyor ~/.xsession-errors
.
Pencere yöneticisi X sunucusunun çocuğudur, bu yüzden çocuklarının ve çocuklarının çıktıları X sunucusuyla aynı yere gider.
Tek kullanıcı sizseniz ve grafik olarak oturum açarsanız, bazı sistemler X sunucusu örneğini çıkış konsolundan değiştirir, yani bu VT'ye geçebilir ve görebilirsiniz. Anekdot olarak, düzenleme genellikle alt-ctrl-f1
X örneği için çıkış konsolu ve alt-ctrl-f7
X ekranıdır, ancak bulabildiğiniz kadarını kontrol edebilirsiniz. İlk 6 genellikle giriş yapar, ancak potansiyel olarak boş veya borulu çıktı ile görünmeyen ve görünecek daha fazlası vardır. Bazılarının başlangıcından çıktılar olabilir, bunu X'in çıktısıyla karıştırmayın. Deneyimlerime göre X ve çocuklar her zaman önemli miktarda uyarı ve mesajlar (eksik fontlar, amortismanlı çağrılar, vb.)
Bir GUI ile giriş yapmazsanız, X'i başlattığınız VT ne olursa olsun, bu bir sorun çünkü çıkana kadar görmeyeceksiniz. Bir GUI girişiyle inanıyorum, XDM (grafiksel giriş) ayrıcalıklı bir süreç olarak çalışıyor, yani çıktıyı borulayabiliyor /dev/tty7
. startx 1>&2> /dev/tty7
Doğru süper kullanıcı ayrıcalıklarına sahipseniz da ( ) yapabilirsiniz .
startx
veya xinit
doğrudan bir zaman çimdik ~/.xinitrc
yapmadan önce gereken şekilde yönlendirmeleri yapmak exec
istenen pencere yöneticisi üzerinde. Ben bu tür bir çıkışı hiç kaçırmadım. GUI uygulamasının ne ürettiğiyle ilgileniyorsam, onu terminalden çalıştırıyorum. Ben stdout'u ve stderr'yi yönlendirdim böylece Ama aslında yararlı olabilir ~/.xinitrc
için ~/.xinitrc.out
.
Bunu alırsanız, genellikle bir program bir dizi diğerini başlatır man 2 fork
ve man 2 execve
sonra bu süreçte varsayılan olarak dosya tanımlayıcıları açık kalır.
Bu sorunun cevabı, genellikle çıktı / hatanın, ebeveynin süreç çıktısının / hatasının çatal zamanında işaret ettiği yere gitmesidir (ana program elbette bazı yönlendirmeler yapmazsa). Üst programın adını tam olarak bilmedikçe daha spesifik bir şey talep edemeyeceğinizi düşünüyorum. Pencere yöneticisi süreci diğer programların doğrudan başlatılmasında nadiren yer alır.
Örneğin benim durumumda
xmonad
pencere yöneticisi tarafından işlenir ) tuşuna basıldığındadmenu_run
dmenu_run
girdimi işleyecek ve bazı uygulamaları başlatacak (ör. xkill
)Çıkış gidecek /dev/tty1
çünkü
xkill
tarafından başlatıldı dmenu_run
dmenu_run
tarafından başlatıldı xmonad
xmonad
tarafından başlatıldı X
X
tarafından başlatıldı startx
startx
ilk sanal konsoldan manuel olarak başlattım /dev/tty1
Yalnızca bir referans için, çıktının / hatanın nereye gittiğini bulmak istiyorsanız veya belirli bir işlem için (bilinen PID ile) açılan dosya tanımlayıcılarının ne olduğunu daha iyi söylemek istiyorsanız,
$ lsof -p PID
ps faux
işlemle ilişkili tty / pts değerlerini kontrol etmek için kullanın . yoksa veya "?" muhtemelen boşlukta kaybolur. (bu sadece bir fikir, yanlış olabilirim)