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
.