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

В случае, если шаг 4 не удаляет все пакеты из qt5-beta1 PPA, линия помогла мне очистить это:

$ grep ^Package: /var/lib/apt/lists/ppa.launchpad.net*sdk*Packages /var/lib/apt/lists/ppa.launchpad.net*qt5-beta1*Packages |awk '{print $2}'|xargs sudo apt-get -y remove

Вы можете выполните ту же команду и замените «apt-get -y remove» на «sudo dpkg -purge», чтобы очистить возможные остатки после apt-get.

1
задан 24 April 2016 в 03:46

2 ответа

Введение

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

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

Создание ярлыка, зависящего от рабочей области Перемещение всех окон из одной рабочей области в другую

Xprop

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

Немного проще, но требуется отфильтровать вывод, использует стек окон 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: [!d21 ] Создание ярлыка, зависящего от рабочего пространства

2
ответ дан 24 May 2018 в 06:38

wmctrl -l может быть то, что вы хотели. Сначала установите его

sudo apt-get install wmctrl

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

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

EDIT:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'
1
ответ дан 24 May 2018 в 06:38
  • 1
    OP хочет получить только имя приложения. Это возможно? – Avinash Raj 15 June 2014 в 18:04
  • 2
    Нет, я открыл браузер Firefox. Ваша команда показывает 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefox плюс некоторые дополнительные строки о Desktop, Hud и т. Д. – Avinash Raj 15 June 2014 в 18:29
  • 3
    @AvinashRaj: извините, я работаю над этим, я добавлю как можно скорее издание, спасибо за внимание – Ruslan Gerasimov 15 June 2014 в 18:31
  • 4
    @AvinashRaj это дополнение, wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}', добавит к моему ответу. Спасибо, что указали. – Ruslan Gerasimov 15 June 2014 в 18:43
  • 5
    извините, не будет работать для меня. – Avinash Raj 15 June 2014 в 18:52

Другие вопросы по тегам:

Похожие вопросы: