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).
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).
Antworten:
Eine Kombination aus wmctrl
und 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 ~/.bashrc
oder sie über eine Skriptdatei ausführen.
Die Leistung von xdotool
und wmctrl
wird 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 qdbus
zwei ausreichende Tools und Installationen bereitzustellen, xdotool
und es wmctrl
sei denn, der Benutzer möchte diese für zusätzliche Funktionen. In dieser Antwort möchte ich zwei Skriptlösungen mit xprop
und vorstellen qdbus
.
Beachten Sie, dass ich keineswegs gegen xdotool
oder 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:
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
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:
wmctrl -l
kö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}'
0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefox
plus einige zusätzliche Zeilen über Desktop, Hud usw.
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.