web-dev-qa-db-ja.com

PIDから特定のターミナルエミュレータウィンドウのデスクトップまたはウィンドウIDを決定する

特定のプロセスが実行されているデスクトップを知りたいのですが、これはウィンドウIDからwmctrlを使用して取得できます。また、親の系統をターミナルプロセスまで追跡することで、特定のプロセスが実行されているターミナルエミュレータプロセスを見つけることもできます。

ただし、特定の端末プロセスでは、複数のウィンドウが複数のデスクトップに分散しています。

最近はターミナルエミュレーターroxtermを使用していますが、Konsoleとgnome-terminalはどちらもこの点で似ています。

これらのアプリの1つ以上にクエリを実行して、特定のプロセスが実行されているウィンドウを見つける方法はありますか? gdbハッカーが必要な場合は、ハックしてください。更新後も機能し続ける可能性が高いものはおそらくより良いでしょうが:)

私はbashの初期化でこのようなものを追跡することに完全に反対しているわけではありませんが、すべての厄介な詳細を整理するのは嫌です。そのようなアプローチでは機能しない重要なEdgeケースがいくつかあるようです。多分誰かがすでにこれを理解しているのですか?

あるいは、そのような内省的なデータにアクセスするためのより豊富なインターフェイスを提供する別のターミナルエミュレーターがある場合は、それを知っておくとよいでしょう。

各ウィンドウを別々のプロセスで実行することでこれを回避することはできますが、メモリ使用量と汎用性の両方の点での妥協(たとえば、あるウィンドウから別のウィンドウへのタブの移動)はおそらく受け入れられません。ほとんどの場合、メモリ使用量です。

2
intuited

多くのターミナルエミュレーター(rxvt、xterm、gnome-terminal、konsoleを含む。roxtermではテストしていません)は、環境変数WINDOWIDをサブプロセス(シェルなど)が開始されたウィンドウのIDに設定します。したがって、Linuxでは、

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

どのウィンドウを教えてくれます$pidはで実行されています。

これは、プロセスがウィンドウ間で移行されている場合、たとえば、画面の下で実行されている場合や、ウィンドウ間でタブを移行した場合は機能しません。