Zuerst habe ich versucht, ein paar Sekunden xterm
zu der xterm
PID zurückzuverfolgen, basierend auf den Informationen, die ich in gefunden habe, /proc/locks
aber sie war locker. Ich meine, es hat funktioniert, denke ich, aber es war im besten Fall ein finanzieller Umstand - ich verstehe nicht alle Informationen, die die Datei bietet, und stimme nur mit den scheinbaren Übereinstimmungen zwischen ihrem Inhalt und bekannten Terminalprozessen überein.
Dann habe ich versucht, lsof/strace
einen aktiven write/talk
Prozess zwischen ptys zu beobachten. Ich hatte noch nie ein Programm benutzt, aber sie scheinen sich darauf zu verlassen utmp
. Wenn meine Zielgruppe utmp
aus irgendeinem Grund keinen Eintrag hatte, wollten sie beide nicht zugeben, dass er existiert. Vielleicht gibt es einen Ausweg, aber ich war verwirrt genug, es aufzugeben.
Ich habe versucht , eine udevadm
Entdeckung mit 136 und 128 Hauptknoten Nummer Gerät wie in der Werbung für pts
und ptm
jeweils in /proc/tty/drivers
, aber mir fehlt auch jede sehr nützliche Erfahrungen mit diesem Werkzeug und wieder nichts Wesentliches aufgedreht. Interessanterweise bemerkte ich jedoch, dass der :min
Bereich für beide Gerätetypen Staffelungen aufwies 0-1048575
.
Erst als ich dieses Kernel-Dokument erneut besuchte , begann ich, über das Problem in Bezug auf mount
s nachzudenken . Ich hatte das schon mehrmals gelesen, aber als mich die weitere Forschung in dieser Zeile zu diesem Patchset von 2012 führte, hatte/dev/pts
ich eine Idee:
sudo fuser -v /dev/ptmx
Ich dachte, was verwende ich normalerweise, um Prozesse mit einem zu verknüpfen mount
? Und sicher genug:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Mit diesen Informationen kann ich zum Beispiel Folgendes tun terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Wie Sie sehen, könnte mit einem kleinen expliziten Test ein solcher Prozess dazu gebracht werden, den Master-Prozess eines beliebigen Pty ziemlich zuverlässig auszugeben. In Bezug auf die Sockets bin ich mir ziemlich sicher, dass man es auch aus dieser Richtung angehen kann, socat
im Gegensatz zu einem Debugger, aber ich muss noch klären, wie. Ich vermute jedoch, dass ss
es hilfreich sein könnte, wenn Sie damit besser vertraut sind als ich:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Also habe ich es mit ein wenig expliziterem Testen eingerichtet:
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
Er druckt $$
num \0
Null - Bytes zu jedem pty und prüft jeden IO - Master - Prozess gegen eine vorherige Überprüfung. Wenn der Unterschied $$
dann ist, ordnet es das pid dem pty zu. Das funktioniert meistens . Ich meine, für mich kehrt es zurück:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
Was richtig ist, aber offensichtlich ist es ein bisschen rassig. Ich meine, wenn einer dieser anderen zu der Zeit ein paar Daten einliest, würde es wahrscheinlich fehlen. Ich versuche herauszufinden, wie man die stty
Modi auf einem anderen Pty ändert, um zuerst das Stoppbit oder so etwas zu senden, damit ich das beheben kann.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, würde die Liste der PIDs (/proc/PID
) als Ausgabe bereitstellen .