Wie erhalte ich über die Befehlszeile eine Liste der ausgeführten Anwendungen?

8

Ich möchte nur laufende Anwendungen wie Firefox, gedit, Nautilus usw. über die Befehlszeile auflisten.

Hinweis: Ich möchte nicht alle laufenden Prozesse auflisten, sondern nur Anwendungen, die ausgeführt werden (z. B. manuell gestartete GUIs).

Pandya
quelle
2
"Nur laufende Anwendung auflisten" Was meinst du? Alle Anwendungen (auch als Prozesse bezeichnet) werden ausgeführt. Du meinst nur geöffnete Fenster wie 'Firefox, Empathie und Thunderbird' oder alle Prozesse, die dein Benutzer gestartet hat, wie 'Unity, Compiz, Gnome-Terminal, Apt-Get'?
Braiam

Antworten:

9

Eine Kombination aus wmctrlund xprop bietet viele Möglichkeiten.

Beispiel 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
}

Die Ausgabe könnte in diesem Fall ähnlich aussehen:

"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

Beispiel 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[@]}" 
}

Ausgabebeispiel:

Firefox
Geany
Gnome-terminal
Mousepad
Thunar
Xfce4-terminal

Sie können die Funktion zu Ihrer hinzufügen ~/.bashrcoder sie über eine Skriptdatei ausführen.

TuKsn
quelle
Aus zwei Gründen hochgestimmt: (1) Es hat die Frage tatsächlich beantwortet. und (2), was am wichtigsten ist, hat nicht versucht, die Frage mit zusätzlichen Informationen zu komplizieren, die ganz klar nicht in den Geltungsbereich der Frage fallen - diese Art von Informationen verursachen bei den Benutzern mehr Verwirrung als sie (uns) zu helfen das Problem verstehen und lösen.
Almir Campos
2

Einführung

Die Leistung von xdotoolund wmctrlwird ausgeschaltet, wenn Sie Manipulationen an den Fenstern vornehmen müssen, z. B. Verschieben oder Ändern der Größe. Ich bin jedoch der festen Überzeugung, dass es eine zwecklose Aufgabe ist, nur laufende Programme und Informationen über diese aufzulistenxprop und qdbuszwei ausreichende Tools und Installationen bereitzustellen, xdotoolund es wmctrlsei denn, der Benutzer möchte diese für zusätzliche Funktionen. In dieser Antwort möchte ich zwei Skriptlösungen mit xpropund vorstellen qdbus.

Beachten Sie, dass ich keineswegs gegen xdotooloder bin wmctrl. Ich habe sie selbst ausgiebig verwendet, finde sie aber in Kombination mit anderen Tools leistungsfähiger. Hier sind nur einige Beispiele, wo ich sie verwendet habe:

Xprop

Das folgende Skript verwendet nur xprop, um eine Liste der aktiven Fenster zu extrahieren, nur echte Fenster herauszufiltern (kein Dock-Typ saugt als Unity Launcher oder Unity Panel) und deren Informationen anzuzeigen:

Demo:

$ 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\""

Script Quelle :

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

Der folgende Code führt im Wesentlichen dieselbe Aufgabe aus, filtert jedoch zuerst Anwendungen heraus, listet dann die untergeordneten Fenster auf und stellt schließlich Informationen zu diesen bereit.

Probelauf:

$ 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"
--------------

Code selbst:

#!/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

Ein etwas einfacherer Befehl, der jedoch das Herausfiltern der Ausgabe erfordert, verwendet die Fensterstapel-dbus-Schnittstelle von Unity. Hier ist im Wesentlichen eine Funktion, die ich in meinem habe.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] }'
}

Probelauf:

$ 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

Beispiele für die Verwendung von qdbus:

Sergiy Kolodyazhnyy
quelle
1

wmctrl -lkönnte eine Sache sein, die Sie wollten. Installieren Sie es zuerst

sudo apt-get install wmctrl

Sie können es auch mit der Liste des Systemmonitors kombinieren. Standardmäßig wird "Alle meine Prozesse" angezeigt, dh alle Prozesse, die Ihnen als Benutzer gehören.

Führen Sie Folgendes aus, um nur die Namen der Anwendungen zu erhalten:

BEARBEITEN:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'
Ruslan Gerasimov
quelle
OP möchte nur den Anwendungsnamen erhalten. Ist das möglich?
Avinash Raj
Nein, ich habe den Firefox-Browser geöffnet. Ihr Befehl zeigt 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefoxplus einige zusätzliche Zeilen über Desktop, Hud usw.
Avinash Raj
@ AvashashRaj: Entschuldigung, ich arbeite daran, ich werde so schnell wie möglich eine Ausgabe hinzufügen, danke für Ihre Aufmerksamkeit
Ruslan Gerasimov
@AvinashRaj dies ist eine Ergänzung wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}', wird zu meiner Antwort hinzufügen. Vielen Dank für den Hinweis.
Ruslan Gerasimov
Entschuldigung, funktioniert nicht für mich.
Avinash Raj