Come posso ottenere un elenco di applicazioni in esecuzione utilizzando la riga di comando?


8

Voglio elencare solo applicazioni in esecuzione come: Firefox, gedit, Nautilus, ecc. Utilizzando la riga di comando.

Nota: non voglio elencare tutto il processo in esecuzione, solo le applicazioni in esecuzione (ad esempio le GUI avviate manualmente).


2
"elenca solo l'applicazione che è in esecuzione" cosa intendi? tutte le applicazioni (note anche come processi) sono in esecuzione. Intendi solo finestre aperte, come "firefox, empathy and thunderbird" o tutti i processi che l'utente ha iniziato come "unity, compiz, gnome-terminal, apt-get"?
Braiam,

Risposte:


9

Una combinazione di wmctrle xprop offre molte possibilità.

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

In questo caso l'output potrebbe essere simile al seguente:

"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

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

Esempio di output:

Firefox
Geany
Gnome-terminal
Mousepad
Thunar
Xfce4-terminal

Puoi aggiungere la funzione alla tua ~/.bashrco eseguirla da un file di script.


Votato per due motivi: (1) ha effettivamente risposto alla domanda; e, (2), cosa più importante, non ha cercato di complicare la domanda con informazioni aggiuntive che chiaramente non rientravano nell'ambito della domanda - questo tipo di informazioni causa più confusione per gli utenti che aiutarli (noi) a capire e risolvere il problema.
Almir Campos

2

introduzione

Il potere di xdotoole wmctrlviene fuori quando è necessario eseguire manipolazioni sulle finestre, come spostare o ridimensionare. Tuttavia, credo fermamente che allo scopo di elencare solo i programmi in esecuzione e le informazioni su di essi, xprope qdbussiano due strumenti sufficienti e l'installazione xdotoole, a wmctrlmeno che l'utente non li desideri per funzionalità aggiuntive, è un'attività senza scopo. In questa risposta vorrei presentare due soluzioni di scripting con xprope qdbus.

Nota che non sono affatto contrario xdotoolo wmctrl. Li ho usati ampiamente da solo, ma li trovo più potenti se combinati con altri strumenti. Ecco alcuni esempi in cui li ho usati:

xprop

Il muggito dello script utilizza solo xprop per estrarre l'elenco delle finestre attive, filtrare solo le finestre vere (non il tipo dock succhiare come Unity Launcher o Unity Panel) e visualizzare le loro informazioni:

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

Fonte dello 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

Il codice seguente esegue essenzialmente la stessa attività, tuttavia filtra prima le applicazioni, quindi elenca le finestre secondarie e infine fornisce informazioni su di esse.

Esecuzione di esempio:

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

Codice stesso:

#!/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 po 'più semplice ma richiede il filtraggio dell'output utilizza l'interfaccia dbus dello stack di finestre di Unity. Qui è essenzialmente una funzione che ho nel mio.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] }'
}

Esecuzione di esempio:

$ 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

Esempi di utilizzo di qdbus:


1

wmctrl -lpotrebbe essere una cosa che volevi. Prima installalo

sudo apt-get install wmctrl

Puoi anche combinarlo con l'elenco di Monitor di sistema, per impostazione predefinita mostra "Tutti i miei processi" che significa tutti i processi che ti appartengono come utente.

Per avere solo nomi di applicazioni, eseguire:

MODIFICARE:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'

OP vuole ottenere solo il nome dell'applicazione. È possibile?
Avinash Raj,

no, ho aperto il browser Firefox. Il tuo comando mostra 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefoxpiù alcune righe extra su Desktop, Hud, ecc.
Avinash Raj,

@AvinashRaj: scusa, ci sto lavorando, aggiungerò al più presto un'edizione, grazie per l'attenzione
Ruslan Gerasimov,

@AvinashRaj questa è un'aggiunta, wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'aggiungerò alla mia risposta. Grazie per averlo sottolineato.
Ruslan Gerasimov,

scusa, non funziona per me.
Avinash Raj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.