Wenn ich ein mache:
echo foo > /dev/pts/12
Einige Prozesse lesen das foo\n
von ihrem Dateideskriptor zur Masterseite.
Gibt es eine Möglichkeit herauszufinden, was diese Prozesse sind?
Oder mit anderen Worten, wie kann ich herausfinden, welches xterm / sshd / script / screen / tmux / expect / socat ... am anderen Ende von ist /dev/pts/12
?
lsof /dev/ptmx
Ich erfahre, welche Prozesse auf der Masterseite eines Pty über Dateideskriptoren verfügen. Ein Prozess selbst kann ptsname()
( TIOCGPTN
ioctl) verwenden, um das Slave-Gerät basierend auf seiner eigenen FD für die Masterseite zu ermitteln. Ich könnte also Folgendes verwenden:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
Gibt lsof
es eine direktere, zuverlässigere und weniger aufdringliche Möglichkeit, an diese Informationen zu gelangen, wenn jedes PID / FD von zurückgegeben wird , um diese Zuordnung zu erstellen?
quelle
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, würde die Liste der PIDs (/proc/PID
) als Ausgabe bereitstellen ./dev/pts/4
. Normalerweise ist dies ein gemeinsamer Vorfahr jener Prozesse, die/dev/pts/4
offen sind, aber nicht unbedingt.screen
, ist es ,screen
dass zuordnet und verwaltet aktiv die pty Slave für die Lebensdauer des Gerätes, sondern - wie ich glaube - die Schale gemacht wird , den Prozess-Führer für das tty und so, wie Ihre ausgangsshows bekommst dubash
oder was auch immerps
nicht abscreen
. Ich habe ein paar davonxterms
auf diexterm
PID zurückverfolgt,/proc/locks
aber sie war locker.Antworten:
Zuerst habe ich versucht, ein paar Sekunden
xterm
zu derxterm
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 aktivenwrite/talk
Prozess zwischen ptys zu beobachten. Ich hatte noch nie ein Programm benutzt, aber sie scheinen sich darauf zu verlassenutmp
. Wenn meine Zielgruppeutmp
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ürpts
undptm
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 aufwies0-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:Ich dachte, was verwende ich normalerweise, um Prozesse mit einem zu verknüpfen
mount
? Und sicher genug:Mit diesen Informationen kann ich zum Beispiel Folgendes tun
terminology
: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, dassss
es hilfreich sein könnte, wenn Sie damit besser vertraut sind als ich:Also habe ich es mit ein wenig expliziterem Testen eingerichtet:
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: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.quelle
Wenn Sie nur suchen, wem die Verbindung gehört und woher sie stammt, funktioniert der Befehl who gut.
Wenn Sie auch wissen möchten, was diese Verbindung abhört, wird dies am Ende angezeigt.
Und um die Pids zu erhalten, beschränken Sie einen Ps auf die Tty-Sitzung, die Sie sich ansehen. Ganz unauffällig zu booten.
Beachten Sie, dass dies je nach Zeitpunkt zu roten Heringen führen kann. Aber es ist ein guter Anfang.
quelle
/dev/pts/4
Sie diesenw
Befehl ausgeführt haben.Ich hatte das gleiche Problem mit qemu und fand schließlich eine sehr schlechte Lösung (aber immer noch eine Lösung): das Parsen des Prozessspeichers.
Dies funktioniert hier, weil ich weiß, dass qemu die Remote-PTS in einer Zeichenfolge mit einem bestimmten Format speichert und auf dem Heap reserviert. Möglicherweise funktioniert es auch in anderen Situationen mit ein paar Änderungen und durch Wiederverwenden der PID aus der Fixierausgabe (andere Antwort überprüfen).
Der Code wird von hier aus angepasst .
quelle