Как получить список запущенных приложений с помощью командной строки?

8

Я хочу перечислить только запущенные приложения, такие как: Firefox, Gedit, Nautilus и т. Д. С помощью командной строки.

Примечание: я не хочу перечислять все запущенные процессы, только приложения, которые работают (скажем, вручную запущенные графические интерфейсы).

Pandya
источник
2
"только приложение списка, которое работает", что вы имеете в виду? все приложения (известные также как процессы) работают. Вы имеете в виду только открытые окна, такие как «firefox, empathy and thunderbird» или весь процесс, который ваш пользователь запустил как «unity, compiz, gnome-terminal, apt-get»?
Брайам

Ответы:

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или запустить ее из файла скрипта.

TuKsn
источник
Проголосовал по двум причинам: (1) он фактически ответил на вопрос; и (2), что наиболее важно, не пытался усложнить вопрос дополнительной информацией, которая явно не входила в суть вопроса - такая информация вызывает больше путаницы у пользователей, чем помогает им (нам) понять и решить проблему.
Альмир Кампос
2

Введение

Сила xdotoolи wmctrlвыходит, когда вам нужно выполнить манипуляции с окнами, такие как перемещение или изменение размера. Тем не менее, я твердо верю, что для целей только перечисления запущенных программ и информации о них, xpropи qdbusдва достаточных инструмента и установки, xdotoolи wmctrlесли пользователь не хочет, чтобы те для дополнительной функциональности - это бесполезная задача. В этом ответе я хотел бы представить два решения для сценариев с xpropи qdbus.

Обратите внимание, что я ни в коем случае не против xdotoolили wmctrl. Я сам широко их использовал, но считаю их более мощными в сочетании с другими инструментами. Вот лишь несколько примеров, где я их использовал:

Xprop

В приведенном ниже скрипте используется только xprop для извлечения списка активных окон, отфильтровывания только истинных окон (не для типа док-станции suck, как Unity 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

Немного более простая команда, но требующая фильтрации выходных данных, использует интерфейс dbus стека окон Unity. Вот, по сути, функция, которую я имею в моем.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

Вы также можете объединить его со списком System Monitor, по умолчанию он показывает «Все мои процессы», что означает все процессы, которые принадлежат вам как пользователю.

Чтобы иметь только имена приложений, запустите:

РЕДАКТИРОВАТЬ:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'
Руслан Герасимов
источник
ОП хочет получить только имя приложения. Это возможно?
Авинаш Радж
нет, я открыл браузер Firefox. Ваша команда показывает 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefoxплюс некоторые дополнительные строки о рабочем столе, Hud и т. Д.
Авинаш Радж
@AvinashRaj: извините, я работаю над этим, я добавлю как можно скорее издание, спасибо за ваше внимание
Руслан Герасимов
@AvinashRaj это дополнение, wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'добавит к моему ответу. Спасибо за указание.
Руслан Герасимов
извини, у меня не работает
Авинаш Радж