私は通常、複数の仮想デスクトップと多くの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を使用している場合は、まずSTY
screenセッションの名前に設定されているこの変数を試してください。を使用してセッションに接続できます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