Para onde vai a saída de um aplicativo iniciado no gerenciador de janelas?

10

Se você iniciar um aplicativo a partir de um terminal, poderá ver a saída para stdout e stderr, mas se um aplicativo for iniciado no gerenciador de janelas, para onde normalmente vai a saída desses arquivos? Para / dev / null?

August Karlstrom
fonte
1
Sugestão: use ps fauxpara verificar quais tty / pts estão associados ao processo. se nenhum ou "?" provavelmente se perde no vazio. (isto é apenas uma idéia, eu posso estar errado)
mveroone
@ Kwaio: O valor é um ponto de interrogação (?), Então, como você diz, provavelmente se perde no vazio.
August Karlstrom
2
Se iniciou a shell gráfica de gdm ou kdm a saída pode ser encontrada em~/.xsession-errors
Shadur

Respostas:

8

A saída de um aplicativo iniciada no gerenciador de janelas vai para o mesmo local que a saída do próprio gerenciador de janelas. (A menos que o aplicativo o redirecione, mas aplicativos GUI típicos não.)

Você pode descobrir para onde vai a saída do WM, observando o que foi aberto no descritor de arquivo 1 (saída padrão) e no descritor de arquivo 2 (erro padrão); normalmente ambos irão para o mesmo arquivo. Descubra o ID do processo do seu gerenciador de janelas (tente, por exemplo, pgrep metacityou pidof metacityse o Metacity é o seu gerenciador de janelas - se você não souber o nome do processo do seu gerenciador de janelas, veja a raiz de uma das árvores de processos relatadas por ps fou pstree). Supondo que o ID do processo do seu gerenciador de janelas seja 1234, execute

lsof -p1234

e procure as linhas correspondentes aos descritores de arquivo 1 e 2, ou

ou

ls -l /proc/1234/fd

Você pode automatizar a filtragem dos descritores de arquivos relevantes:

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

(Nota: todos os comandos acima são para Linux. pgrepÉ comum entre outros departamentos e lsofpode ser instalado praticamente em qualquer lugar; as psopções e o /procconteúdo são diferentes nos diferentes departamentos.)

Na situação comum em que você está executando comandos de um shell em um emulador de terminal (xterm, konsole, gnome-terminal, etc., mas não quando usado na tela ou no tmux), é possível verificar facilmente onde a saída do emulador de terminal está indo, como o emulador de terminal é o processo pai do seu shell. Isso não funciona se o emulador de terminal estiver sendo executado com privilégios adicionais, o que acontece em alguns sistemas para permitir que o emulador de terminal grave na lista de usuários conectados (utmp).

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

Muitas distribuições direcionam a saída da sessão X para ~/.xsession-errors.

Gilles 'SO- parar de ser mau'
fonte
No meu caso, a hierarquia pai-filho a partir do WM é uma caixa preta <- lightdm <- lightdm <- init e todos os ttys têm o valor "?". Acho que a saída não vai a lugar algum.
August Karlstrom
@AugustKarlstrom Então, pidof blackboxou pgrep blackboxpara obter o PID do gerenciador de janelas, ou diretamente lsof -p$(pidof blackbox). Ttys não tem nada a ver com isso.
Gilles 'SO- stop be evil'
1
Ah, claro. O comando ls -l /proc/<blackbox-id>/fdme diz que stdout vai /dev/nulle stderr vai ~/.xsession-errors.
August Karlstrom
1

O gerenciador de janelas é filho do servidor X, portanto, ele e a saída de seus filhos vão para o mesmo local que o servidor X.

Se você é o único usuário e efetua login graficamente, alguns sistemas deslocam a instância do servidor X do console de saída, o que significa que você pode alternar para esse VT e vê-lo. Curiosamente, o arranjo geralmente alt-ctrl-f1é o console de saída da instância X e alt-ctrl-f7a exibição X, mas você pode verificar o maior número possível. Os 6 primeiros geralmente geram logins, mas há potencialmente mais que não aparecem e aparecerão em branco ou com saída canalizada. Pode haver saída em alguns deles a partir do init, não confunda isso com a saída do X. Na minha experiência, X e filhos sempre emitem uma quantidade significativa de avisos e mensagens (sobre fontes ausentes, chamadas obsoletas, etc.).

Se você não fizer login por meio de uma GUI, será qualquer VT do qual você iniciou o X, o que é um problema, já que você não verá isso até sair. Acredito que com um login da GUI, o XDM (o login gráfico) é executado como um processo privilegiado, o que significa que ele pode canalizar a saída /dev/tty7. Você também pode ( startx 1>&2> /dev/tty7) se tiver os privilégios corretos de superusuário.

Cachinhos Dourados
fonte
1
No caso de startxou xinitdiretamente, sempre é possível ajustar ~/.xinitrcos redirecionamentos conforme necessário antes de fazer execno gerenciador de janelas desejado. Eu nunca perdi esse tipo de saída. Se eu estiver interessado em qual aplicativo GUI está produzindo, eu o executo no terminal. Mas, na verdade, pode ser útil, então redirecionei o stdout e o stderr de ~/.xinitrcpara ~/.xinitrc.out.
Miroslav Koškár
0

Se você considerar que normalmente um programa inicia outro executando séries man 2 forke man 2 execve, nesse processo, os descritores de arquivo padrão permanecem abertos.

Portanto, a resposta é que normalmente a saída / erro vai para onde a saída / erro do processo dos pais estava apontando no tempo da bifurcação (a menos que o programa pai faça alguns redirecionamentos, é claro). Acho que você não pode reivindicar nada mais específico, a menos que saibamos exatamente o nome do programa pai. O processo do gerenciador de janelas raramente está envolvido no lançamento de outros programas diretamente.

Por exemplo no meu caso

  • pressionar Ctrl + P (tratado pelo xmonadgerenciador de janelas) começarádmenu_run
  • dmenu_runmanipulará minha entrada e iniciará alguma aplicação (por exemplo xkill)

A saída irá para /dev/tty1porque

  • xkill foi iniciado por dmenu_run
  • dmenu_run foi iniciado por xmonad
  • xmonad foi iniciado por X
  • X foi iniciado por startx
  • startx foi iniciado por mim manualmente a partir do primeiro console virtual /dev/tty1

Apenas para uma referência, se você quiser descobrir para onde vai a saída / erro, ou melhor dizer o que são descritores de arquivo abertos para um processo específico (com PID conhecido), faça

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