Na początku próbowałem prześledzić kilka xterm
sekund z powrotem do xterm
pid na podstawie informacji, które znalazłem, /proc/locks
ale było luźne. Myślę, że zadziałało, jak sądzę, ale w najlepszym razie było okolicznościowe - nie do końca rozumiem wszystkie informacje dostarczane przez plik i pasowały tylko do tego, co wydawało się odpowiadać między jego zawartością a znanymi procesami końcowymi.
Potem próbowałem oglądać lsof/strace
aktywny write/talk
proces między ptys. Nigdy wcześniej nie korzystałem z żadnego z tych programów, ale wydaje się, że polegają na nich utmp
. Jeśli mój celowany pty nie miał żadnego utmp
wpisu z jakiegokolwiek powodu, obaj odmówili przyznania się do jego istnienia. Może jest na to jakiś sposób, ale byłem na tyle zdezorientowany, żeby to porzucić.
Próbowałem udevadm
odkrycia z 136 i 128 głównymi numerami urządzeń, jak w reklamie pts
i ptm
odpowiednio /proc/tty/drivers
, ale brakuje mi również bardzo użytecznego doświadczenia z tym narzędziem i po raz kolejny nie znalazłem nic znaczącego. Co ciekawe, zauważyłem, że :min
zasięg dla obu typów urządzeń został wymieniony w oszałamiający sposób 0-1048575
.
Jednak dopiero po ponownym przejrzeniu tego dokumentu jądra zacząłem myśleć o problemie w kategoriach mount
s. Przeczytałem to kilka razy wcześniej, ale kiedy dalsze badania w tej linii doprowadziły mnie do tego zestawu łatek z 2012 roku, /dev/pts
wpadłem na pomysł:
sudo fuser -v /dev/ptmx
Pomyślałem, czego zwykle używam do kojarzenia procesów z mount
? I na pewno:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Dzięki tym informacjom mogę na przykład terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Jak widać, przy odrobinie wyraźnego testowania taki proces mógłby zostać wykonany w celu rzetelnego wyprowadzenia głównego procesu dowolnego pty. Jeśli chodzi o gniazda, jestem całkiem pewien, że można podejść do niego również z tego kierunku, używając socat
zamiast debuggera, ale muszę jeszcze wyjaśnić, jak to zrobić. Podejrzewam jednak, że ss
może ci pomóc, jeśli znasz się bardziej niż ja:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Więc skonfigurowałem to z nieco bardziej wyraźnymi testami, w rzeczywistości:
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
Drukuje $$
num \0
null bajty na każdym pty i sprawdza io każdego procesu nadrzędnego względem poprzedniego sprawdzenia. Jeśli różnica jest taka, $$
to wiąże pid z pty. To głównie działa. To znaczy dla mnie zwraca:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
Co jest poprawne, ale oczywiście jest to trochę ryzykowne. Chodzi mi o to, że jeśli któryś z nich czytałby w tym czasie wiele danych, prawdopodobnie by tego nie zauważył. Próbuję wymyślić, jak zmienić stty
tryby na innym pty, aby najpierw wysłać bit stopu lub coś w tym rodzaju, aby to naprawić.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, dostarczy listę PIDs (/proc/PID
) jako dane wyjściowe.