Aplicação no terminal ainda em execução mas não diretamente acessível [duplicado]

1

Eu tenho um tipo de problema estranho que não encontrei antes. Aqui está o que eu fiz:

Eu iniciei um aplicativo com ./myApp .

Não há argumentos de linha de comando, não há & para executá-lo em segundo plano.

Infelizmente, meu sistema congelou em algum momento. Nenhum acesso através da GUI era possível, então decidi primeiro parar todas as tarefas com uso intensivo de CPU. Então eu criei um tty (atalho Ctrl + Alt + F2 no Ubuntu) e fiz kill -STOP pid , depois de obter o% corretopid de myApp com top .

Felizmente, após algum tempo extra, o sistema ficou descongelado. Então eu reiniciei o processo com kill -CONT pid .

Mas aqui está o que eu vejo no terminal:

[2]+ Stopped  ./myApp

E agora o terminal está no estado como se o aplicativo não estivesse em execução (por exemplo, eu posso fazer ls ou o que quiser), mas o gerenciador de processos ainda relata que o aplicativo está sendo executado. Fico muito feliz porque perdi 34 horas de computação (e sim, é um aplicativo extremamente ruim; não foi escrito por mim, é claro), já que não há saída para o arquivo.

Quando a tarefa pesada do aplicativo terminar (esperada em algumas horas), preciso inserir uma tarefa específica dentro do aplicativo para torná-lo gravar no arquivo (é um pouco como um shell personalizado solicitando entrada, então eu acho que cin está em uso).

Então, a questão é: como me trazer de volta para o aplicativo de tal forma que eu vejo sua saída e pode interagir com ele? Se não for possível: é possível transmitir para o aplicativo e iniciar o comando necessário sem reiniciar o aplicativo?

Atualizar O aplicativo ainda faz a saída para o mesmo terminal exato.

FYI, como você pode precisar: Estou executando o Ubuntu x86 com o kernel 3.2.0-36

    
por stefan 07.01.2013 / 23:28

1 resposta

0

Eu não acredito que seja possível reconectar um console a um processo que não tenha psuedo-tty associado.

Para cenários futuros em que é necessário manter uma conexão com um console, tente usar screen .

A tela é uma ferramenta projetada para a interface entre uma instância específica de um shell e o terminal local. Por ser um man-in-the-middle, você pode desanexar do processo em execução e reconectar-se a ele mais tarde. Isso é útil se você tiver conexões de Internet não confiáveis se estiver usando o SSH para gerenciamento do sistema ou em instâncias como a sua com um processo de longa duração.

Quando você abrir seu terminal (seja na GUI ou em um dos ttys reais), basta digitar screen . Deve ser instalado por padrão no Ubuntu. Tela irá lembrá-lo que está executando o seu shell padrão e como encontrar ajuda. Em seguida, ele executará seu shell de login e ficará fora do caminho.

Em seu uso mais básico, você pode usar Ctrl-A , seguido por D para desanexar da sessão atual. Para se reconectar a essa sessão, use: screen -r <complete name of session> . Se você não conseguir lembrar o nome da sessão, a opção de comando -ls fornecerá detalhes sobre quais sessões estão disponíveis.

A tela pode fazer muito mais do que eu não tive muitas oportunidades de usar, mas anos atrás, a equipe de suporte da Digium me ajudou a configurar uma de suas placas de interface POTS analógicas usando uma conexão SSH reversa e Tela no modo multiusuário . Isso deu a eles acesso root ao meu servidor Asterisk de forma segura, sem a necessidade de eles saberem a senha e com a capacidade de eu auditar o que estava sendo feito.

    
por 07.01.2013 / 23:45