Como identificar o processo que está enviando mensagens de erro para o terminal?

3

A seguinte mensagem de erro aparece ocasionalmente no meu terminal:

Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory

... o que é muito chato.

Eu procurei on-line por soluções para esse erro, sem sucesso.

Existe alguma maneira de pelo menos identificar o processo responsável por enviar essas mensagens de erro para o meu terminal?

Deixe-me esclarecer que, até onde posso dizer , essas mensagens de erro aparecem "inesperadamente". Na verdade, eles aparecem de forma assíncrona em relação às minhas interações com o terminal (na maioria das vezes, eu as vejo pela primeira vez quando volto a uma janela de terminal sem supervisão por algum tempo). Tenho certeza de que há uma causa definitiva e determinista para essas mensagens, mas não é uma que eu possa identificar prontamente. Em resumo, não notei nenhum padrão ou regularidade para sua ocorrência.

Em particular, no meu caso a sua ocorrência não tem nada a ver com a execução do MPlayer, ou qualquer outro programa de reprodução de vídeo. (Por favor, consulte meu post anterior sobre isso .) Por um lado, a máquina em questão é uma máquina de trabalho, e eu raramente assisto vídeos com ela. Nos poucos casos em que assisti a um vídeo nesta máquina, usei o VLC, não o MPlayer, e esses erros nunca apareceram nessas raras ocasiões em que usei o VLC.

    
por kjo 29.06.2013 / 11:52

2 respostas

3

lsof "$(tty)" faz o que você pede, listando o que tem seu terminal aberto para leitura ou gravação.

Você pode verificar o que foi gravado em seu terminal se ainda tiver seu terminal aberto, o que geralmente é o caso, pelo menos se ele ainda estiver em execução. É possível que ele tenha enviado uma mensagem de erro para o seu terminal, fechou o descritor de arquivo para ele, mas continuou rodando. Mas o motivo mais provável de você não conseguir verificar é se o processo em si é executado apenas de forma intermitente.

  • jobs mostra seu jobs de fundo . Se você executou o processo com & , ele é executado de forma assíncrona-- ou suspende-o com Ctrl + Z - e ele ainda está em execução, então o jobs builtin mostrará a menos que você tenha disown ed.
  • Caso isso não seja suficiente, lsof "$(tty)" listará tudo o que tiver seu terminal aberto para leitura ou gravação . Isso funciona mesmo no caso raro de algo que grava no seu terminal sem ter sido iniciado ou descido de algum outro processo que foi.
  • Mas, para sua situação específica, recomendo que você leia a parte no final desta resposta que corrige essa mensagem de erro.

É possível que você tenha muitos programas gráficos com seu terminal aberto para gravação:

  • Isso pode acontecer se você estiver executando uma parte importante do seu ambiente de área de trabalho (que inicia muitos outros programas) em seu terminal, como o Unity ou outro shell gráfico.
  • Em particular, se você tiver executado um comando como unity --replace & do seu terminal, isso explicaria erros inesperados de aplicativos que aparecem nele .
  • Então, se seu objetivo é silenciar as mensagens, você não deve executá-lo ou executá-lo de maneira diferente (ou de um terminal diferente). A melhor abordagem depende do motivo pelo qual você está executando.
  • Você pode executar pstree para ver seu process tree , que pode ajudar.

Seu dispositivo de terminal é um "arquivo" e você pode passar o nome do arquivo para lsof .

Você pode obter uma lista de processos que possuem o terminal atual - o terminal no qual você executa o comando - aberto para leitura ou gravação, passando o caminho para seu nome do dispositivo para o lsof comando. Como tty produz esse caminho, você pode executá-lo e executar lsof com o que mostra, ou você pode usar qualquer um dos seguintes:

lsof "$(tty)"        # "$(tty)" may expand to /dev/tty1, /dev/pts/0, /dev/pts/1, etc.
lsof $(tty)          # bad form, but device names rarely have whitespace/globbing characters
lsof 'tty'           # same as above, just with the old disfavored backtick syntax
lsof /proc/$$/fd/1   # the shell expands $$ to its own process ID (fd/0, fd/1, or fd/2 work)

A saída normalmente será parecida com essa, se os únicos programas que você está executando no seu terminal forem o seu shell e - é claro - lsof em si:

lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    27763   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    2u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek  255u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29311   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29311   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29311   ek    2u   CHR  136,0      0t0    3 /dev/pts/0

Se você tiver mais coisas em execução que leiam ou gravem no seu terminal, elas devem ser exibidas. Note que os comandos mostrados acima devem ser executados a partir do terminal onde você vê as mensagens irritantes . Você pode fazer isso a partir de um terminal separado também, mas você deve fornecer lsof um caminho para o terminal em que está interessado. Por exemplo, você pode executar tty no terminal que deseja conhecer e usar o caminho mostra como o argumento para lsof no terminal do qual você deseja executá-lo.

Com relação ao acesso e às permissões, você pode estar se perguntando:

  • O aviso tracefs pode ou não aparecer para você. De qualquer maneira, você provavelmente não precisa se preocupar . Normalmente, é do sistema de arquivos de depuração que está completamente indisponível em vez de ficar restrito a você, então ...
  • É possível que você se beneficiaria da execução de lsof como root com sudo , mas provavelmente não. Normalmente, você pode visualizar informações sobre todos os processos e, mesmo que seu sistema esteja configurado para não permitir isso, o que estiver fazendo isso provavelmente está sendo executado como você, de qualquer maneira.

Alguns processos aparecem mais de uma vez, porque eles têm seu terminal aberto mais de uma vez . Eu realmente não recomendo tentar mostrar apenas processos que têm o seu terminal aberto para escrever , porque:

  • Quando o mesmo processo aparece várias vezes, elas são mostradas juntas, portanto, as entradas extras não devem ser confusas.
  • É raro qualquer coisa, mas o seu shell e os programas que você executa são leitura do seu terminal.Geralmente, você pode visualizá-los com jobs , o que dá uma linha (ou menos) por processo. Se você estiver usando lsof , deseja detalhes.
  • Os processos que aparecem apenas uma vez têm seu terminal aberto apenas para gravação (ou apenas para leitura), e esses são de interesse especial.

Um exemplo lsof : cat ing de um terminal para outro.

Você não precisa fazer isso - é realmente apenas uma demonstração. Esta seção existe apenas porque:

  • Você pode ver nada que explique seu problema na saída de lsof e queira algum tipo de confirmação de que ele realmente está mostrando processos que gravam em seu terminal, mesmo que eles não tenham sido iniciados a partir dele.
  • Você pode estar interessado em saber como isso funciona e tentar testá-lo em uma situação que você controla.
  • Outros leitores que estão interessados neste tópico por diferentes razões podem querer mais explicações do que aparece na seção anterior, para que possam descobrir como usar isso para resolver seus próprios problemas diferentes.

Se você acabou de executar tty no seu terminal, por si só, ele imprime o caminho para o nó do dispositivo do seu terminal:

ek@Io:~$ tty
/dev/pts/0

Isso nem sempre será /dev/pts/0 . Você pode abrir outro terminal e executar tty e o caminho será diferente. Vá em frente e faça isso.

No segundo terminal, execute cat , mas redirecione sua saída para o primeiro terminal. Para fazer isso, execute isso, mas substitua /dev/pts/0 pelo que tty mostrou quando você o executou no primeiro terminal:

cat >/dev/pts/0

Digite o texto no segundo terminal e pressione Enter . Ele aparecerá no seu primeiro terminal.

No primeiro terminal, execute qualquer um dos comandos lsof mostrados acima.

ek@Io:~$ lsof "$(tty)"
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    27763   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    2u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek  255u   CHR  136,0      0t0    3 /dev/pts/0
cat     29476   ek    1w   CHR  136,0      0t0    3 /dev/pts/0
lsof    29479   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29479   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29479   ek    2u   CHR  136,0      0t0    3 /dev/pts/0

Seu terminal não destacará a linha com cat - eu acabei de fazer isso para mostrar a diferença.

(No segundo terminal onde cat está rodando, você pode sair pressionando Ctrl + D no início de uma linha, ou apenas pressionando < kbd> Ctrl + C. Se você digitar texto em uma linha e pressionar Ctrl + D , isso irá liberar a entrada buffer, mesmo que você não tenha pressionado Enter , e você verá o texto no primeiro terminal.)

Depuração de erros "Falha ao abrir o backend do VDPAU"

Embora seja uma resposta geral para a questão de como encontrar o que está sendo escrito em seu terminal e isso pode ajudá-lo, há outras abordagens que você deve considerar para o problema específico que você descreveu aqui. Além das mensagens do kernel em consoles virtuais - o que não é - mensagens mostradas no seu terminal geralmente vêm de algum programa que você executou do seu terminal, ou algum programa que um desses esses programas foi executado, etc.

Como a resposta do NickTh diz, se você não estiver executando manualmente nada do seu terminal que parece que poderia produzir essas mensagens, verifique os arquivos em que seu shell pode executar comandos quando for iniciado , especialmente .profile e .bashrc (como NickTh menciona ) porque esses são aqueles que você provavelmente modificou.

O erro que você está vendo provavelmente não é um bug no próprio MPlayer, mas sim em uma biblioteca que ele usa, que é usada por muitos outros programas. Se você está rodando qualquer programas gráficos do seu terminal - especialmente se você os colocou em segundo plano com & , então eles rodam de forma assíncrona com o seu shell - então um ou mais deles é quase certamente a razão pela qual você está vendo essas mensagens. Os navegadores da Web são particularmente propensos a produzi-los, principalmente porque eles podem executar plug-ins, como o Adobe Flash, que usam a biblioteca afetada.

Existem vários bugs relatados no Launchpad sobre mensagens de erro como esta. O Bug 808254 é particularmente semelhante ao que você descreveu. O Bug 1300215 é especialmente proeminente, embora envolva um driver de vídeo da Intel. Você pode pesquisar no Launchpad pelo texto da mensagem para encontrar mais bugs. Você pode encontrar soluções alternativas - seja apenas para silenciar as mensagens ou para fazer mais sobre o bug - em tais relatórios de bugs e seus comentários. Além disso, enquanto a outra pergunta linkado em a resposta do NickTh é sobre o problema é que ele ocorre no MPlayer e tem várias soluções alternativas específicas do MPlayer como respostas, a resposta atualmente mais votada não é específica do MPlayer e pode funcionar para você.

Se você estiver executando muitos programas do seu terminal, você pode ter visto muitas entradas na saída de lsof (se você decidiu usar esse método na solução de problemas). Uma maneira de descobrir qual programa está produzindo a saída é executar seus programas a partir de terminais separados. Isso funciona mesmo se seus terminais separados forem iniciados uns dos outros - um emulador de terminal GUI como o GNOME Terminal não passa as mensagens de erro ou outro texto que ele exibe até o terminal a partir do qual foi executado (se houver). Da mesma forma, uma maneira de deixar de ser incomodado por esse problema - supondo que as mensagens irritantes são o único problema real - é não executar as coisas do seu terminal que você não quer saída no seu terminal. Normalmente você pode conseguir isso usando seus menus gráficos. Mas, por favor, veja o topo desta resposta para saber por que você pode estar executando mais do seu terminal do que você precisa ou pretende.

    
por Eliah Kagan 22.09.2017 / 19:40
1

Geralmente, as mensagens de erro no terminal não aparecem por si mesmas. Você deve executar algo e este algo deve falhar e uma mensagem como esta pode aparecer. Veja por exemplo este Q & A: GNOME Mplayer: "Falha ao abrir VDPAU backend libvdpau_nvidia .so "erro

Então, qual é o aplicativo que você executou no terminal que produz tal erro?

Se esta mensagem aparecer quando você abrir o terminal, veja se adicionou algo dentro do arquivo .bashrc ou do arquivo .profile .

A solução que funcionou para mim em casos semelhantes foi a criação de um link, conforme descrito na resposta acima (Link eu dei).

    
por Nick Thom 29.06.2013 / 12:08