Onde é que a saída de uma aplicação iniciada a partir do gerenciador de janelas vai?

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 a partir do gerenciador de janelas, para onde vai a saída para esses arquivos? Para / dev / null?

    
por August Karlstrom 14.08.2013 / 11:02

3 respostas

8

A saída de um aplicativo iniciado a partir do 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 os aplicativos típicos de GUI não o fazem.)

Você pode descobrir onde a saída do WM vai, olhando o que tem 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 (por exemplo, pgrep metacity ou pidof metacity se o Metacity for seu gerenciador de janelas - se você não souber o nome do processo para seu gerenciador de janelas, veja a raiz de uma das árvores de processo reportado 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 unices, e lsof pode ser instalado praticamente em qualquer lugar; ps opções e /proc conteúdo são diferentes em diferentes uniões.)

Na situação comum em que você está executando comandos de um shell em execução 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 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 .

    
por 15.08.2013 / 02:05
1

O gerenciador de janelas é o 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 faz login graficamente, alguns sistemas substituem a instância do servidor X do console de saída, o que significa que você pode alternar para aquele VT e veja. Curiosamente, a disposição é geralmente que alt-ctrl-f1 é o console de saída da instância X e alt-ctrl-f7 é a exibição X, mas você pode verificar quantos você puder encontrar. Os primeiros 6 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 depreciadas, etc.).

Se você não fizer login através de uma GUI, será o que você iniciou no X, o que é um problema, já que você não verá isso até você 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 enviar saída para /dev/tty7 . Você também pode ( startx 1>&2> /dev/tty7 ) se tiver privilégios de superusuário corretos.

    
por 14.08.2013 / 16:07
0

Se você considerar que normalmente um programa inicia outro fazendo séries de man 2 fork e man 2 execve , então, nesse processo, por padrão, os descritores de arquivos permanecem abertos.

Portanto, a resposta é que normalmente a saída / erro vai onde a saída / erro do processo pai estava apontando no momento do fork (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

  • pressionando Ctrl + P (gerenciado pelo xmonad gerenciador de janelas) iniciará dmenu_run
  • dmenu_run manipulará minha entrada e iniciará algum aplicativo (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 encontrar onde saída / erro vai, ou melhor dizer o que são descritores de arquivos abertos para um processo específico (com PID conhecido), faça

$ lsof -p PID
    
por 14.08.2013 / 15:42