명령 줄을 사용하여 실행중인 응용 프로그램 목록을 얻으려면 어떻게합니까?


8

커맨드 라인을 사용하여 Firefox, gedit, Nautilus 등과 같은 실행중인 응용 프로그램 만 나열하고 싶습니다.

참고 : 실행중인 모든 프로세스를 나열하고 싶지는 않지만 실행중인 응용 프로그램 (예 : 수동으로 실행 된 GUI) 만 나열하고 싶습니다.


2
"실행중인 응용 프로그램 만 목록"이란 무엇입니까? 모든 응용 프로그램 (프로세스라고도 함)이 실행 중입니다. '파이어 폭스, 공감 및 썬더 버드'와 같은 열린 창 또는 사용자가 '통일, 컴 피즈, 그놈 터미널, apt-get'과 같이 시작한 모든 프로세스 만 열었습니까?
Braiam 2016 년

답변:


9

여러 가지 가능성을 조합 wmctrl하여 xprop제공합니다.

예 1 :

running_gui_apps() {

    # loop through all open windows (ids)
    for win_id in $( wmctrl -l | cut -d' ' -f1 ); do 

        # test if window is a normal window
        if  $( xprop -id $win_id _NET_WM_WINDOW_TYPE | grep -q _NET_WM_WINDOW_TYPE_NORMAL ) ; then 

            echo "$( xprop -id $win_id WM_CLASS | cut -d" " -f4- )"", window id: $win_id"

        fi

    done
}

이 경우 출력은 다음과 유사하게 보일 수 있습니다.

"Firefox", window id: 0x032000a9
"Gnome-terminal", window id: 0x03a0000c
"Thunar", window id: 0x03600004
"Geany", window id: 0x03c00003
"Thunar", window id: 0x0360223e
"Mousepad", window id: 0x02c00003
"Mousepad", window id: 0x02c00248
"Xfce4-terminal", window id: 0x03e00004

예 2 :

running_gui_apps() {
    applications=()

    # loop through all open windows (ids)
    for win_id in $( wmctrl -l | cut -d' ' -f1 ); do 

        # test if window is a normal window
        if  $( xprop -id $win_id _NET_WM_WINDOW_TYPE | grep -q _NET_WM_WINDOW_TYPE_NORMAL ) ; then 

            # filter application name and remove double-quote at beginning and end
            appname=$( xprop -id $win_id WM_CLASS | cut -d" " -f4 )
            appname=${appname#?}
            appname=${appname%?}

            # add to result list
            applications+=( "$appname" ) 

        fi

    done

    # sort result list and remove duplicates  
    readarray -t applications < <(printf '%s\0' "${applications[@]}" | sort -z | xargs -0n1 | uniq)

    printf -- '%s\n' "${applications[@]}" 
}

출력 예 :

Firefox
Geany
Gnome-terminal
Mousepad
Thunar
Xfce4-terminal

함수를 추가 ~/.bashrc하거나 스크립트 파일에서 실행할 수 있습니다.


다음과 같은 두 가지 이유로 인해 투표에 찬성했습니다. (1) 실제로 질문에 답변했습니다. (2) 가장 중요한 것은 질문의 범위에 포함되지 않은 추가 정보로 질문을 복잡하게 만들려고 시도하지 않았습니다. 문제를 이해하고 해결하십시오.
Almir Campos

2

소개

이동 또는 크기 조정과 같은 창에서 조작을 수행해야 할 때 의 힘 xdotoolwmctrl나옵니다. 그러나, 나는 강력하게 만의 목적으로 믿고 목록 그들에 대해 실행중인 프로그램과 정보를, xprop그리고 qdbus두 충분한 도구 및 설치 xdotoolwmctrl목적이없는 작업입니다 - 사용자가 추가 기능을 그 싶어하지 않는 한. 이 답변에서 xpropand 와 함께 두 가지 스크립팅 솔루션을 제시하고 싶습니다 qdbus.

xdotool또는 에 반대하는 것은 아닙니다 wmctrl. 나는 그것들을 광범위하게 사용했지만 다른 도구와 결합하면 더 강력하다는 것을 알았습니다. 다음은 내가 사용한 몇 가지 예입니다.

Xprop

스크립트 벨로우즈는 xprop 만 사용하여 활성 창의 목록을 추출하고 실제 창만 필터링하고 (Unique Launcher 또는 Unity Panel과 같은 독 유형 흡입하지 않음) 정보를 표시합니다.

데모:

$ bash xprop_windows.sh                                                        
XID TYPE    TITLE
--------------------------------

56623112| "x-terminal-emulator", "X-terminal-emulator"| "sakura"

81789126| "Navigator", "Firefox"| "Restore Session - Mozilla Firefox"

82002372| "Navigator", "Firefox"| "gui - How do I get a list of running applications by using the command line? - Ask Ubuntu - Mozilla Firefox"

33554444| "gnome-terminal", "Gnome-terminal"| "\"Terminal\""

33554486| "gnome-terminal", "Gnome-terminal"| "\"Terminal\""

스크립트 소스 :

get_hex_xids()
{
xprop -root -notype _NET_CLIENT_LIST | \
     awk 'BEGIN{printf "ibase=16"}\
     {gsub(/\,/," ");for(i=1;i<=NF;i++) \
     if ($i~/0x/) printf ";%s",substr(toupper($i),3)   }'  
}

convert_hex2dec()
{
  HEXIDS=$(get_hex_xids)
  echo $HEXIDS | bc
}

print_header()
{
  printf "%s\t%s\t%s\n" "XID" "TYPE" "TITLE"
  printf "%s\n" "--------------------------------"
}

list_info()
{
  convert_hex2dec | while read line;
  do
  TYPE=$( xprop -id $line _NET_WM_WINDOW_TYPE | awk -F '=' '{print $2}'   )
  if [ $TYPE != "_NET_WM_WINDOW_TYPE_NORMAL"   ]; then
     continue
  fi
  CLASS=$(xprop -id $line WM_CLASS | awk -F '=' '{print $2}' )
  NAME=$( xprop -id $line _NET_WM_NAME | awk -F '=' '{print $2}'   )
  printf "\n%s|%s|%s\n" "$line" "$CLASS" "$NAME"

  done
}
print_header
list_info

Qdbus

코드 벨로우즈는 본질적으로 동일한 작업을 수행하지만 먼저 응용 프로그램을 필터링 한 다음 자식 창을 나열하고 마지막으로 이에 대한 정보를 제공합니다.

샘플 실행 :

$ bash ~/bin/qdbus_windows.sh                                                  
Name: Terminal
Active :false
Children:
33554486|false|""Terminal""
33554444|false|""Terminal""
--------------
Name: Firefox Web Browser
Active :false
Children:
82002372|false|"gui - How do I get a list of running applications by using the command line? - Ask Ubuntu - Mozilla Firefox"
81789126|false|"Restore Session - Mozilla Firefox"
--------------
Name: MY CUSTOM TERMINAL
Active :true
Children:
56623112|true|"sakura"
--------------

코드 자체 :

#!/bin/bash

get_window_paths()
{
  qdbus org.ayatana.bamf  /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.WindowPaths
}

get_running_apps()
{
  qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.RunningApplications
}

list_children()
{
 qdbus org.ayatana.bamf "$1"  org.ayatana.bamf.view.Children
}

window_info()
{
for window in "$@" ; do
 XID=${window##*/}
 TYPE=$(qdbus org.ayatana.bamf $window org.ayatana.bamf.window.WindowType)                                         
 NAME="$(qdbus org.ayatana.bamf $window org.ayatana.bamf.view.Name)"
 ACTIVE=$(qdbus org.ayatana.bamf $window org.ayatana.bamf.view.IsActive)
 MONITOR=$(qdbus org.ayatana.bamf $window org.ayatana.bamf.window.Monitor)
# printf "%s|%s|%s|%s\n" $TYPE $MONITOR $ACTIVE "$NAME" 
 printf "%s|%s|\"%s\"\n" $XID $ACTIVE "$NAME" 
done
}

window_paths=( $( get_window_paths | tr '\n' ' ') )
apps_list=( $( get_running_apps | tr '\n' ' ' ) )

for app in ${apps_list[@]} ; do
#echo $app
  printf "Name: "
  qdbus org.ayatana.bamf $app org.ayatana.bamf.view.Name
  printf "Active :"
  qdbus org.ayatana.bamf $app org.ayatana.bamf.view.IsActive
  printf "Children:\n"
#  list_children $app
  windows=( $( list_children $app | tr '\n' ' ' ) )
  window_info "${windows[@]}"
  printf "%s\n"  "--------------"
done

조금 더 간단한 명령이지만 출력을 필터링 해야하는 것은 Unity의 창 스택 dbus 인터페이스를 사용합니다. 여기 본질적으로 내가 가진 기능 이 있습니다..mkshrc

window_stack()
{
  qdbus --literal com.canonical.Unity.WindowStack  
        /com/canonical/Unity/WindowStack  \
        com.canonical.Unity.WindowStack.GetWindowStack | \
  awk -F '{' '{gsub(/\}|\]|,/,"");gsub(/\[/,"\n");print $2}' | \
  awk '!/compiz/&&!/^$/ && $4!="\""$3"\""  { L[n++] = $0 }\
       END { while(n--) print L[n] }'
}

샘플 실행 :

$ window_stack
Argument: (usbu) 56623112 "x-terminal-emulator" true 0 
Argument: (usbu) 82002372 "firefox" false 0 
Argument: (usbu) 81789126 "firefox" false 0 
Argument: (usbu) 33554486 "gnome-terminal" false 0 
Argument: (usbu) 33554444 "gnome-terminal" false 0

qdbus 사용법의 예 :


1

wmctrl -l당신이 원하는 것 일 수 있습니다. 먼저 설치

sudo apt-get install wmctrl

시스템 모니터 목록과 결합 할 수도 있습니다. 기본적으로 "모든 프로세스"가 표시되며 이는 사용자로서 귀하에게 속한 모든 프로세스를 의미합니다.

응용 프로그램 이름 만 가지려면 다음을 실행하십시오.

편집하다:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'

OP는 응용 프로그램 이름 만 가져 오려고합니다. 이것이 가능한가?
Avinash Raj

아니요, 파이어 폭스 브라우저를 열었습니다. 귀하의 명령은 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla FirefoxDesktop, Hud 등에 대한 몇 줄을 더 보여줍니다 .
Avinash Raj

@AvinashRaj : 내가 일하고 죄송합니다, 나는 최대한 빨리 에디션을 추가 할 것입니다, 당신의 관심을 주셔서 감사합니다
루슬란 Gerasimov

@ AvinashRaj 이것은 추가이며 wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'내 답변에 추가됩니다. 지적 해 주셔서 감사합니다.
Ruslan Gerasimov 2014 년

죄송합니다. 작동하지 않습니다.
Avinash Raj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.