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?
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.
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.
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
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)~/.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
oupidof 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 porps f
oupstree
). Supondo que o ID do processo do seu gerenciador de janelas seja 1234, executee procure as linhas correspondentes aos descritores de arquivo 1 e 2, ou
ou
Você pode automatizar a filtragem dos descritores de arquivos relevantes:
(Nota: todos os comandos acima são para Linux.
pgrep
É comum entre outros departamentos elsof
pode ser instalado praticamente em qualquer lugar; asps
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).
Muitas distribuições direcionam a saída da sessão X para
~/.xsession-errors
.fonte
pidof blackbox
oupgrep blackbox
para obter o PID do gerenciador de janelas, ou diretamentelsof -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 ealt-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.fonte
startx
ouxinit
diretamente, sempre é possível ajustar~/.xinitrc
os redirecionamentos conforme necessário antes de fazerexec
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
eman 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 exemploxkill
)A saída irá para
/dev/tty1
porquexkill
foi iniciado pordmenu_run
dmenu_run
foi iniciado porxmonad
xmonad
foi iniciado porX
X
foi iniciado porstartx
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
fonte