Defina as configurações da linha TTY do terminal enquanto um processo está em execução

0

Quando preciso configurar as linhas do terminal quando o terminal está disponível, eu uso stty .

Quando eu conecto um depurador a um processo que está executando curses, as configurações atuais do tty atrapalham a execução do depurador (o echo está desativado, as novas linhas não são traduzidas). Gostaria de ativar echo e onlcr , para que eu possa usar corretamente o depurador ( pdb ).

Quando eu suspendo esse processo ( Ctrl + z ) para verificar as configurações de controle com stty , essas configurações do terminal não foram alteradas. Acho que as maldições podem salvar / restaurar essas configurações nos sinais de suspensão / retomada.

Existe uma maneira de definir remotamente as configurações do terminal com um processo ativo sem suspender o shell pai?

    
por Bryce Guinta 14.05.2017 / 00:29

1 resposta

0

O stdout de um processo é um descritor de arquivo que está disponível como um caminho em algum lugar em um sistema UNIX. Nós precisaremos encontrar este caminho para definir seus atributos tty. Como isso é uma maldição, este descritor de arquivo apontará para um dispositivo de terminal (pts / tty).

O primeiro passo é encontrar o pid do processo em execução. Usando pidof , pgrep ou ps aux :

ps aux | grep '<program arguments>'

Depois de ter o pid do processo em execução, você pode encontrar o caminho do dispositivo de terminal anexado a esse processo usando proc (se disponível) ou lsof .

Obtenha o caminho tty / pts usando lsof :

 device="$(lsof -X -p <pid> | grep -o '/dev/.*' | grep -v urandom | uniq)"

O que lhe dará algo como:

 device=/dev/pts/4

Aqui, usamos a opção -X para ignorar as conexões TCP para impedir que o lsof seja interrompido e -p para informar ao lsof que está recebendo um pid .

Se /proc estiver disponível (linux), então você pode encontrar um link simbólico sob seu pid:

device=/proc/<pid>/fd/1

Agora que conhecemos o dispositivo de saída, podemos definir seus atributos tty:

stty onlcr echo icrnl icanon -F $device

Por padrão, stty define os atributos tty do stdin do terminal atual. Você pode usar -F para especificar um caminho.

Agora, por algum motivo, tive que definir esses atributos várias vezes para que eles fiquem:

while true; do stty onlcr echo icrnl icanon -F /proc/<pid>/fd/1; done

Nota: Depois de escrever isso, percebi que ps pode listar o TTY anexado ao lado do processo: ps ao args,tty .

    
por 14.05.2017 / 02:11