次のコマンドを使用して、各ウィンドウのプロセスIDを一覧表示できます。
wmctrl -lp
各ウィンドウを表示するコマンドがありますrunning command
(htopに「コマンド」列があるのと同じ)。
そうでなければ、最終的にこれを達成するためにどのようにコマンドを結合しますか?
答え1
wmctrl -lp
これにより、出力のpidが見つかった場合はそのコマンドに置き換えられます。
wmctrl -lp | awk '{ pid=$3; cmd="ps -o comm= " pid; while ((cmd | getline command) > 0) { sub(" " pid " ", " " command " ") }; close(cmd) } 1'
これは明らかにリモートプロセスを表示するウィンドウでは機能しません。場合によっては、サンドボックスプロセスに対応するウィンドウに奇妙な結果が表示されることがあります(例えばフラットパック)。
AWK スクリプトは各行を読み取り、pid を抽出し、対応するps -o comm=
コマンドを実行します。見つかった場合は、対応するpid文字列をコマンドで置き換えます。
答え2
と、今日何か学びましたwmctrl
。
まあ、かなり近いです!次のPIDを取得して適切なコマンドを確認してください。
for pid in $(wmctrl -lp | tr -s " "| cut -d ' ' -f3); do
#^--|------|--------------|-----------|------------- for .. in .. loop
# | | | |
# \------|--------------|-----------|------------- name of the variable we'll set
# | | | each iteration
# | | |
# \--------------|-----------|------------- $(command): replaces $(..)
# | | with output of `command`
# | |
# \-----------|------------- translate character " " by -s:
# | "squeeze" multiple consecutive
# | spaces into one
# |
# \-------------- cut at ' ', take the 3rd field
cat "/proc/${pid}/cmdline"
echo ""
done
また、興味深い点は次のとおりです。
for wm_id in $(wmctrl -l | cut -d ' ' -f1); do
xprop -id "${wm_id}" WM_CLASS
done