Bestimmen der Desktop- oder Fenster-ID eines bestimmten Terminalemulatorfensters aus einer PID

2083
intuited

Ich möchte wissen, auf welchem ​​Desktop ein bestimmter Prozess ausgeführt wird. Ich kann dies über die Fenster-ID erhalten wmctrl. Ich kann auch herausfinden, in welchem ​​Terminalemulatorprozess ein bestimmter Prozess ausgeführt wird, indem ich die elterliche Abstammung bis zu einem Terminalprozess nachverfolge.

Ein bestimmter Terminalprozess hat jedoch mehrere Fenster, die auf mehrere Desktops verteilt sind.

Ich benutze den Terminal-Emulator roxtermheutzutage, obwohl sowohl Konsole als auch gnome-terminal in dieser Hinsicht ähnlich sind.

Gibt es eine Möglichkeit, eine oder mehrere dieser Apps abzufragen, um herauszufinden, in welchem ​​Fenster ein bestimmter Prozess ausgeführt wird? Wenn es gdbHacker braucht, hacken Sie weg. Obwohl etwas, das nach einem Update wahrscheinlich weiterarbeitet, wahrscheinlich besser wäre :)

Ich bin nicht völlig dagegen, dieses Zeug bei der bash-Initialisierung zu verfolgen, aber ich hasse es, alle blutigen Details herauszufinden, und es scheint wahrscheinlich, dass es einige bedeutende Randfälle gibt, die mit einem solchen Ansatz nicht funktionieren. Vielleicht hat jemand das schon herausgefunden?

Wenn es jedoch einen anderen Terminal-Emulator gibt, der eine reichhaltigere Schnittstelle für den Zugriff auf solche introspektiven Daten bietet, wäre dies gut zu wissen.

Ich könnte dies umgehen, indem Sie jedes Fenster in einem separaten Prozess ausführen, aber die Kompromisse hinsichtlich der Speicherauslastung und der Vielseitigkeit (z. B. das Verschieben eines Tabs von einem Fenster in ein anderes) sind möglicherweise nicht akzeptabel. Meistens ist es die Speichernutzung.

1

1 Antwort auf die Frage

2
Gilles

Viele Terminal-Emulatoren (einschließlich rxvt, xterm, gnome-terminal und konsole; ich habe es nicht mit roxterm getestet) setzen die Umgebungsvariable WINDOWIDauf die ID des Fensters, in dem der Subprozess (z. B. die Shell) gestartet wurde.

</proc/$pid/environ tr \\0 \\n | sed -n 's/^WINDOWID=//p' 

sagt Ihnen, in welchem ​​Fenster $pidläuft.

Dies funktioniert nicht, wenn der Prozess zwischen Fenstern migriert wurde, z. B. wenn er unter dem Bildschirm ausgeführt wird oder wenn Sie Registerkarten zwischen Fenstern migriert haben.

Tatsächlich. Es bedeutet auch, dass ich es irgendwo als Teil meiner .bashrc aufbewahren muss und mit seltsamen Inkonsistenzen umgehen muss. Das ist hilfreich zu wissen, es ist zuverlässiger als `wmctrl: ACTIVE:`. * edit *: ..err warten, ich habe die Antwort gerade überflogen. Ähm, das ist wirklich sehr hilfreich, danke. Vielleicht könnte ich inotify diese Dateien ausführen ... ?? Ist das eine verrückte Idee? intuited vor 14 Jahren 0
Die Auswirkungen von `screen` im Spiel sind interessant: Dies bedeutet, dass ich eigentlich nach einer * Liste * von Fenster-IDs suche. Ich würde das jetzt gehen lassen :) intuited vor 14 Jahren 0
ähm ... inverstanden, inotify würde nicht funktionieren, wenn sich etwas in der Prozessumgebung ändert, wenn so etwas passiert, was ich bezweifle. Ich muss die übergeordnete Umgebung ("screen", "roxterm" usw.) auf Änderungen überprüfen und davon ausgehen, dass sie dort nachverfolgt wird, was unwahrscheinlich erscheint. intuited vor 14 Jahren 0