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 metacity
ou pidof metacity
se 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 f
ou 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 lsof
pode ser instalado praticamente em qualquer lugar; as ps
opções e o /proc
conteú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 blackbox
ou pgrep blackbox
para 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>/fd
me diz que stdout vai /dev/null
e 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-f7
a 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.
startx
ou xinit
diretamente, sempre é possível ajustar ~/.xinitrc
os redirecionamentos conforme necessário antes de fazer exec
no 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 ~/.xinitrc
para ~/.xinitrc.out
.
Se você considerar que normalmente um programa inicia outro executando séries man 2 fork
e 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
xmonad
gerenciador de janelas) começarádmenu_run
dmenu_run
manipulará minha entrada e iniciará alguma aplicação (por exemplo xkill
)A saída irá para /dev/tty1
porque
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
ps faux
para 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)