シェルまたはプロセスが実行されているxtermを識別する方法は?

シェルまたはプロセスが実行されているxtermを識別する方法は?

私は通常、複数の仮想デスクトップと多くのxtermを含む長期実行Xセッションを使用します。

また、シェル(zsh)でジョブ制御を使用しています。

時には、単純なコマンドを使用してxtermが実行されている(またはハングしている)シェルまたはプロセスを識別できるようにしたい場合があります。

たとえば、vimを使用してファイルを編集すると、vimはまだ実行されている他のvimインスタンスでファイルがすでに開いているという警告を表示します。しかし、今プロセスIDがXYZのvimが起動し、一時停止されたxtermを忘れました。停止したので殺すのは効果がありません。シグナルを介して復元して終了すると機能しますが、フォアグラウンドで実行されているプロセスが混乱し、複数のウィンドウが設定されているため、vimインスタンスを終了したくない場合があります。

現在私はawesomewmを使用していますが、他のwmsの解決策にも興味があります。

答え1

Xterm はWINDOWID子プロセスの環境に変数を入れます。その値は xterm ウィンドウのウィンドウ ID です。 PIDに基づいてプロセス環境を照会するPOSIXメソッドはありません。プロセス環境を照会$pidし、WINDOWID変数を抽出するLinuxの方法は次のとおりです。

</proc/$pid/environ gawk -v 'RS=\0' -F = '$1=="WINDOWID" {print $2}'

wmctrlその後、ウィンドウマネージャインタフェースを使用してウィンドウを検索または操作できます。

screenを使用している場合は、まずSTYscreenセッションの名前に設定されているこの変数を試してください。を使用してセッションに接続できますscreen -rd -S "$sessionname"

答え2

これを使用して、ps -o ppid= PIDプロセスPIDの親IDを取得できます。これはおそらくプロセスを開始したシェルです。シェルの親IDはインクルード端末になります。


テストのためにしばらく続くプロセスを作成しました。

$ sleep 5m &
[1] 31177

次に、プロセス31177の親プロセスとコマンドが何であるかを調べました。

$ ps -o ppid= 31177
31107
$ ps -o cmd= 31107
zsh

31107は私が実行しているzshプロセスですsleep 5m。私はzshその過程でこれを繰り返しました。

$ ps -o ppid= 31107
31097
$ ps -o cmd= 31097
xterm

31097はxterm私のzshシェルが実行される場所です。


必要な親エントリがどれだけ離れているかわからない場合は、指定したコマンド名で親エントリを検索できます。

pid="$1"
cmd="$2"

seek=""
while [ "$seek" != "$cmd" ]; do
    # ps -o ppid= $pid
    pid=`ps -o ppid= $pid`
    seek=`ps -o cmd= $pid`

    if [ ${pid/ /} = 1 ]; then
        echo Reached the top of the tree
        exit 1
    fi
done

echo $pid

テスト:

$ /tmp/find-parent 31177 xterm
31097

関連情報