Pergunta

Eu estou trabalhando em um controlador de aplicação para um programa que é um texto cuspir diretamente para / dev / tty.

Este é um controlador de aplicativo de produção, que deve ser capaz de capturar todo o texto vai para o terminal. Geralmente, este não é um problema. Nós simplesmente redirecionar stdout e stderr. Esta aplicação particular está fazendo chamadas diretas para ecoar e redirecionar o resultado para / dev / tty (echo "some text" > /dev/tty). Redirecionamentos via meu controlador de aplicação não estão a travar o texto.

Eu tenho a fonte para esta aplicação, mas não estou em posição de modificá-lo, nem é a ser mais mantido. Todas as ideias sobre como travar e / ou jogar fora a saída?

Foi útil?

Solução

Não consigo bastante determinar se o programa screen mencionado por @flolo vai fazer o que você precisa ou não. Pode, mas eu não tenho certeza se há um recurso de registro embutido, que parece ser o que você precisa.

Provavelmente é um programa lá fora já a fazer o que você precisa. Eu tinha nomear sudosh como uma possibilidade.

Se você acabar precisando de escrever o seu próprio, você provavelmente vai precisar usar um pseudo-tty (PTY) e ter o seu controlador de sit aplicação entre conexão terminal real do usuário e do dispositivo pty, onde ele pode logar tudo o que você precisa para iniciar sessão. Isso não é trivial. Você pode encontrar informações sobre isso em Rochkind de " Avançada UNIX Programação, 2a ed " livro, e sem dúvida outros livros semelhantes (Stevens' 'Programação avançada no UNIX Ambiente' livro é um candidato provável, mas eu não tenho uma cópia para verificar se).

Outras dicas

 screen -D -m yourEvilProgram

deve funcionar. Muito tempo passou sinced eu usei, mas se você precisa ler um pouco de sua saída poderia mesmo ser possível que você poderia utilizar alguns soquetes para lê-lo.

[ Adicionado : dois links, Rackaid e Pixelbeat , e a página inicial em GNU ]

A solução clássica para o controlo de uma aplicação como este é Esperar , que define-se pseudo-terminais, faz login e unidades da aplicação controlada a partir de um script. Ele vem com um monte de scripts de exemplo para que você provavelmente só pode adaptar um para atender às suas necessidades.

Isto é o que eu fiz em python

import pty, os

pid, fd = pty.fork()
if pid == 0: # In the child process execute another command
    os.execv('./my-progr', [''])
    print "Execv never returns :-)"
else:
    while True:
        try:
            print os.read(fd,65536),
        except OSError:
            break
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top