Pencere yöneticisinden başlatılan bir uygulamanın çıktısı nereye gidiyor?


10

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?


1
Öneri: ps fauxiş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)
mveroone

@Kwaio: Değer bir soru işareti (?) Olduğundan, dediğin gibi, muhtemelen boşlukta kaybolur.
Ağustos Karlstrom

2
Grafik kabuğunuzu gdm veya ~/.xsession-errors
kdm'den başlattıysanız

Yanıtlar:


8

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 metacityya 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 fya 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. pgrepDiğer unices arasında yaygındır ve lsofhemen hemen her yere kurulabilir; psseçenekler ve /prociç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.


Benim durumumda WM'den başlayan çocuk-ebeveyn hiyerarşisi, <- lightdm <- lightdm <- karartmasıdır ve tüm tty'ler "?" Değerine sahiptir. Sanırım çıktı hiçbir yere gitmiyor.
Ağustos Karlstrom

@AugustKarlstrom Sonra pidof blackboxveya pgrep blackboxpencere yöneticisinin PID'sini almak için veya doğrudan lsof -p$(pidof blackbox). Ttys'in bununla hiçbir ilgisi yok.
Gilles 'SO- kötü olmayı bırak'

1
Ah, elbette. Komut ls -l /proc/<blackbox-id>/fdbana stdout'un gittiğini /dev/nullve stderr'ın gittiğini söylüyor ~/.xsession-errors.
Ağustos Karlstrom

1

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-f1X örneği için çıkış konsolu ve alt-ctrl-f7X 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/tty7Doğru süper kullanıcı ayrıcalıklarına sahipseniz da ( ) yapabilirsiniz .


1
Durumunda startxveya xinitdoğrudan bir zaman çimdik ~/.xinitrcyapmadan önce gereken şekilde yönlendirmeleri yapmak execistenen 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 ~/.xinitrciçin ~/.xinitrc.out.
Miroslav Koškár

0

Bunu alırsanız, genellikle bir program bir dizi diğerini başlatır man 2 forkve man 2 execvesonra 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

  • Ctrl + P ( xmonadpencere yöneticisi tarafından işlenir ) tuşuna basıldığındadmenu_run
  • dmenu_rungirdimi 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.