![列出所有Windows的运行命令](https://linux22.com/image/200080/%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89Windows%E7%9A%84%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
您可以使用以下命令列出每个寡妇的进程 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