Anexar a uma saída de processos para visualização


110

Como eu 'anexaria' uma visualização de console / terminal a uma saída de aplicativo para que eu possa ver o que ela está dizendo?

Como eu desanexaria a saída de um aplicativo sem encerrar o aplicativo?

Normalmente, se você iniciar um aplicativo falante usando a linha de comando, verá todos os tipos de resultados maravilhosos. No entanto, digamos que eu tenha uma programação particularmente falante em execução, como KINO, e desejo ver sua saída a qualquer momento, sem reiniciá-la por meio da linha de comando. Não posso; pelo menos não sei como.


1
Você tem um símbolo de depuração em seu processo? Funciona em ambiente de produção? E se sim, você NUNCA precisa ser pausado?
yves Baumes,

Quando tenho ataques de problemas de estabilidade com programas de usuário final como o kino (trava e mata meu som), quero saber como / por que travou para poder trabalhar para consertá-lo. Este não é um programa que estou desenvolvendo, mas uma técnica que gostaria de saber para solucionar problemas. Vou tentar sua sugestão abaixo.
aggitan

Respostas:


17

Existem algumas opções aqui. Uma é redirecionar a saída do comando para um arquivo e, em seguida, usar 'tail' para ver as novas linhas que são adicionadas a esse arquivo em tempo real.

Outra opção é lançar seu programa dentro da 'tela', que é uma espécie de aplicativo de Terminal baseado em texto. As sessões de tela podem ser anexadas e desanexadas, mas, nominalmente, devem ser usadas apenas pelo mesmo usuário, então, se você quiser compartilhá-las entre os usuários, é um grande pé no saco.


1
"Existem algumas opções aqui. Uma é redirecionar a saída do comando para um arquivo e, em seguida, usar 'tail' para ver as novas linhas que são adicionadas a esse arquivo em tempo real." Isso pode ser feito com aplicativos já em execução?
aggitan

2
Você provavelmente precisa de tail -f $ log_file para obter a saída conforme está escrita no arquivo. Além disso, não, não há nenhuma maneira que eu conheça de fazer isso com um aplicativo já em execução.
Varkhan,

@aggitan: Não. Para os aplicativos existentes, você terá que reiniciá-los, porque eles já vincularam sua E / S ao terminal de controle.
Don Werve,


286

Acho que tenho uma solução mais simples aqui. Procure um diretório cujo nome corresponda ao PID que você está procurando, no pseudo-sistema de arquivos acessível no /proccaminho. Portanto, se você tiver um programa em execução, cujo ID é 1199, cdnele:

$ cd /proc/1199

Em seguida, procure o fddiretório abaixo

$ cd fd

Este fddiretório contém os objetos descritores de arquivo que seu programa está usando (0: stdin, 1: stdout, 2: stderr) e apenas tail -fo que você precisa - neste caso, stdout):

$ tail -f 1

9
Não consegui usar tailporque no meu caso a saída foi redirecionada para outro processo de entrada, mas moreme mostrou os dados atuais.
Ωmega

10
Um dos posts mais fascinantes deste site!
robert

2
moreestá trabalhando para mim. ubuntu 14.04 em um processo de nó
Shih-Min Lee

1
Isso não está funcionando para mim com um processo java que chama System.out.println. Não há nenhuma saída para / proc / [pid] / fd / 1
Nick

1
Tentei criar uma reprodução usando o abaixo, mas sem sucesso: `` `docker run -it --name container1 ubuntu bash -c -i" COUNT = 0; enquanto true; do echo Mantenha a batida da pista de dança indo; (( COUNT ++)); sleep 1; echo \ "A contagem é: \ $ {COUNT} \"; concluído; " `` `Em outro terminal:` `` docker exec -it container1 tail -f / proc / 1 / fd / 1 `` `
JacobWuzHere

54

Eu estava procurando exatamente a mesma coisa e descobri que você pode fazer:

strace -ewrite -p $PID

Não é exatamente o que você precisava, mas está bem perto.

Tentei redirecionar a saída, mas não funcionou para mim. Talvez porque o processo estava gravando em um soquete, não sei.


obrigado, ele funciona, mas a saída está truncada, por exemplo, para ping: write (1, "64 bytes de 1.0.0.1: icmp_seq =" ..., 56) = 56
izy

8

Como eu 'anexaria' uma visualização de console / terminal a uma saída de aplicativo para que eu possa ver o que ela está dizendo?

Sobre essa questão, sei que é possível pegar a saída, mesmo quando você não executou o comando sceen antes de iniciar o processus.

Embora nunca tenha experimentado, encontrei um artigo interessante que explica como fazer usando GDB (e sem reiniciar o processo).

redirecionando-saída-de-um-processo em execução

Basicamente:

  1. Verifique a lista de arquivos abertos para o seu processo, graças a / proc / xxx / fd
  2. Anexe seu processo com GDB
  3. Enquanto ele está pausado, feche o arquivo no qual está interessado, chamando a função close () (você pode qualquer função do seu processo no GDB. Suspeito que você precisa de símbolos de depuração em seu processo ..)
  4. Abra um novo arquivo chamando a função create () ou open (). (Dê uma olhada nos comentários no final, você verá que as pessoas sugerem o uso de dup2 () para garantir que o mesmo identificador estará em uso)
  5. Desanexe o processo e deixe em execução.

A propósito, se você está executando um sistema operacional Linux no i386, os comentários falam sobre uma ferramenta melhor para redirecionar a saída para um novo console: 'retty' . Em caso afirmativo, considere seu uso.


5

Para mim, isso funcionou:

  1. Faça login como o proprietário do processo (mesmo sem rootpermissão)

    ~$ su - process_owner
    
  2. Tail o descritor de arquivo conforme mencionado em muitas outras respostas.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

2

Eu queria assistir remotamente um processo de atualização do yum executado localmente, então, embora provavelmente houvesse maneiras mais eficientes de fazer isso, aqui está o que eu fiz:

watch cat /dev/vcsa1

Obviamente, você deseja usar vcsa2, vcsa3, etc., dependendo de qual terminal está sendo usado.

Contanto que minha janela de terminal tivesse a mesma largura do terminal em que o comando estava sendo executado, eu poderia ver um instantâneo de sua saída atual a cada dois segundos. Os outros comandos recomendados em outro lugar não funcionaram muito bem para minha situação, mas aquele funcionou.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.