다음 명령을 사용하여 각 창의 프로세스 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