No começo, tentei rastrear alguns xterm
segundos até o xterm
pid, com base nas informações que encontrei, /proc/locks
mas estavam soltas. Quero dizer, funcionou, acho, mas foi na melhor das hipóteses circunstanciais - não compreendo completamente todas as informações que o arquivo fornece e correspondia apenas ao que parecia corresponder entre o conteúdo e os processos terminais conhecidos.
Então eu tentei assistir lsof/strace
em um write/talk
processo ativo entre ptys. Eu nunca tinha usado nenhum dos programas antes, mas eles parecem confiar utmp
. Se o meu site direcionado não tivesse uma utmp
entrada por qualquer motivo, ambos se recusariam a admitir que existia. Talvez haja uma maneira de contornar isso, mas fiquei confuso o suficiente para abandoná-lo.
Tentei alguma udevadm
descoberta com 136 e 128 nós principais de dispositivos, conforme anunciado pts
e ptm
respetivamente /proc/tty/drivers
, mas também não tenho experiência muito útil com essa ferramenta e, mais uma vez, não achei nada substancial. Curiosamente, porém, notei que o :min
intervalo para os dois tipos de dispositivos estava listado de forma impressionante 0-1048575
.
Não foi até eu revisitar isso documento do kernel que comecei a pensar sobre o problema em termos de mount
s. Eu tinha lido isso várias vezes antes, mas quando a pesquisa contínua nessa linha me levou a esse patchset de 2012/dev/pts
, tive uma idéia:
sudo fuser -v /dev/ptmx
Pensei no que costumo usar para associar processos a um mount
? E com certeza:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Então, com essas informações eu posso fazer, por exemplo terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Como você pode ver, com um pouco de teste explícito, esse processo pode ser feito para gerar de maneira bastante confiável o processo mestre de um arquivo arbitrário. Em relação aos soquetes, tenho quase certeza de que alguém poderia abordá-lo dessa direção, usando também o socat
oposto de um depurador, mas ainda não entendi como. Ainda assim, suspeito que ss
possa ajudar se você estiver mais familiarizado com isso do que eu:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Então, configurei-o com um pouco de teste mais explícito, na verdade:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
Ele imprime um $$
número de \0
bytes nulos para cada arquivo e compara o io de cada processo mestre com um teste anterior. Se a diferença é $$
então, associa o pid ao pty. Isso principalmente funciona . Quero dizer, para mim, retorna:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
O que é correto, mas, obviamente, é um pouco atrevido. Quero dizer, se um desses outros estivesse lendo um monte de dados na época, provavelmente sentiria falta. Estou tentando descobrir como alterar os stty
modos em outro pty para enviar o bit de parada primeiro ou algo assim, para que eu possa consertar isso.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, forneceria a lista de PIDs (/proc/PID
) como saída.