¿Cómo obtengo una lista de aplicaciones en ejecución usando la línea de comando?

8

Quiero enumerar solo aplicaciones en ejecución como: Firefox, gedit, Nautilus, etc. usando la línea de comando.

Nota: No quiero enumerar todos los procesos en ejecución, solo las aplicaciones que se están ejecutando (digamos GUI iniciadas manualmente).

Pandya
fuente
2
"solo enumere la aplicación que se está ejecutando" ¿qué quiere decir? Todas las aplicaciones (conocidas también como procesos) se están ejecutando. ¿Te refieres solo a ventanas abiertas, como 'firefox, empatía y thunderbird' o todos los procesos que tu usuario inició como 'unidad, compiz, gnome-terminal, apt-get'?
Braiam

Respuestas:

9

Una combinación de wmctrly xprop ofrece muchas posibilidades.

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

El resultado podría verse en este caso similar a este:

"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

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

Ejemplo de salida:

Firefox
Geany
Gnome-terminal
Mousepad
Thunar
Xfce4-terminal

Puede agregar la función a su ~/.bashrco ejecutarla desde un archivo de script.

TuKsn
fuente
Votaron por dos razones: (1) en realidad respondió la pregunta; y (2), lo más importante, no trató de complicar la pregunta con información adicional que claramente no estaba dentro del alcance de la pregunta: este tipo de información causa más confusión a los usuarios que ayudarlos (a nosotros) a Comprender y resolver el problema.
Almir Campos
2

Introducción

El poder de xdotooly wmctrlsale cuando necesita realizar una manipulación en las ventanas, como mover o cambiar el tamaño. Sin embargo, creo firmemente que con el propósito de enumerar solo programas en ejecución e información sobre ellos, xpropy que qdbusson dos herramientas e instalación suficientes xdotooly, a wmctrlmenos que el usuario quiera esas para funcionalidad adicional, es una tarea sin propósito. En esta respuesta, me gustaría presentar dos soluciones de secuencias de comandos con xpropy qdbus.

Tenga en cuenta que de ninguna manera estoy en contra xdotoolo wmctrl. Los he usado extensamente, pero los encuentro más poderosos cuando se combinan con otras herramientas. Aquí hay algunos ejemplos donde los he usado:

Xprop

El siguiente script usa solo xprop para extraer la lista de las ventanas activas, filtrar solo las ventanas verdaderas (no el tipo de acoplamiento suck como Unity Launcher o Unity Panel) y mostrar su información:

Manifestación:

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

Fuente del script :

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

El siguiente código realiza esencialmente la misma tarea, sin embargo, primero filtra las aplicaciones, luego enumera sus ventanas secundarias y finalmente proporciona información sobre ellas.

Ejecución de muestra:

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

Código en sí:

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

Un comando un poco más simple pero requiere filtrar la salida usando la interfaz dbus de la pila de ventana de Unity. Aquí es esencialmente una función que tengo en mi.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] }'
}

Ejecución de muestra:

$ 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

Ejemplos de uso de qdbus:

Sergiy Kolodyazhnyy
fuente
1

wmctrl -lpodría ser algo que quisieras. Primero instálalo

sudo apt-get install wmctrl

También puede combinarlo con la lista de System Monitor, de manera predeterminada muestra "Todos mis procesos", lo que significa todos los procesos que le pertenecen como usuario.

Para tener solo nombres de aplicaciones, ejecute:

EDITAR:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'
Ruslan Gerasimov
fuente
OP quiere obtener solo el nombre de la aplicación. es posible?
Avinash Raj
No, abrí el navegador Firefox. Su comando muestra 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefoxmás algunas líneas adicionales sobre Desktop, Hud, etc.
Avinash Raj
@AvinashRaj: lo siento, estoy trabajando en ello, agregaré lo antes posible una edición, gracias por su atención
Ruslan Gerasimov
@AvinashRaj esta es una adición wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}', se agregará a mi respuesta. Gracias por señalar
Ruslan Gerasimov
lo siento, no funciona para mi
Avinash Raj