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?
~/.xsession-errors
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?
~/.xsession-errors
Respostas:
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.
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.
ls -l /proc/<blackbox-id>/fdme diz que stdout vai /dev/nulle stderr vai ~/.xsession-errors.
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.
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.
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
xmonadgerenciador de janelas) começarádmenu_rundmenu_runmanipulará minha entrada e iniciará alguma aplicação (por exemplo xkill)A saída irá para /dev/tty1porque
xkill foi iniciado por dmenu_rundmenu_run foi iniciado por xmonadxmonad foi iniciado por XX foi iniciado por startxstartx foi iniciado por mim manualmente a partir do primeiro console virtual /dev/tty1Apenas 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
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)