Bagaimana cara saya mendapatkan daftar aplikasi yang sedang berjalan dengan menggunakan baris perintah?

8

Saya ingin daftar hanya menjalankan aplikasi seperti: Firefox, gedit, Nautilus, dll. Menggunakan baris perintah.

Catatan: Saya tidak ingin mendaftar semua proses yang berjalan, hanya aplikasi yang berjalan (katakanlah GUI yang diluncurkan secara manual).

Pandya
sumber
2
"hanya daftar aplikasi yang sedang berjalan" apa maksudmu? semua aplikasi (dikenal juga sebagai proses) sedang berjalan. Maksud Anda hanya membuka jendela, seperti 'firefox, emphy and thunderbird' atau semua proses yang dimulai oleh pengguna seperti 'unity, compiz, gnome-terminal, apt-get'?
Braiam

Jawaban:

9

Kombinasi wmctrldan xprop menawarkan banyak kemungkinan.

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

Outputnya dapat terlihat dalam kasus ini seperti ini:

"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

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

Contoh keluaran:

Firefox
Geany
Gnome-terminal
Mousepad
Thunar
Xfce4-terminal

Anda dapat menambahkan fungsi ke ~/.bashrcatau menjalankannya dari file skrip.

TuKsn
sumber
Dipilih karena dua alasan: (1) menjawab pertanyaan; dan, (2), yang paling penting, tidak mencoba menyulitkan pertanyaan dengan informasi tambahan yang jelas-jelas tidak ada dalam cakupan pertanyaan - jenis informasi ini menyebabkan lebih banyak kebingungan bagi pengguna daripada membantu mereka (kami) untuk Memahami dan memecahkan masalah.
Almir Campos
2

pengantar

Kekuatan xdotooldan wmctrlkeluar ketika Anda perlu melakukan manipulasi pada windows, seperti memindahkan atau mengubah ukuran. Namun, saya sangat percaya bahwa untuk tujuan hanya mendaftarkan program yang sedang berjalan dan informasi tentang mereka, xpropdan qdbusmerupakan dua alat yang cukup dan menginstal xdotooldan wmctrlkecuali pengguna menginginkannya untuk fungsionalitas tambahan - adalah tugas tanpa tujuan. Dalam jawaban ini saya ingin menyajikan dua solusi scripting dengan xpropdan qdbus.

Perhatikan bahwa saya tidak menentang xdotoolatau wmctrl. Saya sendiri telah menggunakannya secara ekstensif, tetapi saya menemukan mereka lebih kuat ketika dikombinasikan dengan alat lain. Berikut adalah beberapa contoh di mana saya telah menggunakannya:

Xprop

Script di bawah ini hanya menggunakan xprop untuk mengekstrak daftar windows yang aktif, memfilter hanya windows yang sebenarnya (bukan tipe dock isap sebagai Unity Launcher atau Unity Panel) dan tampilkan info mereka:

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

Sumber skrip :

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

Kode di bawah ini pada dasarnya melakukan tugas yang sama, namun menyaring aplikasi terlebih dahulu, kemudian mencantumkan jendela anak-anaknya, dan akhirnya memberikan info tentangnya.

Contoh dijalankan:

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

Kode itu sendiri:

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

Perintah yang sedikit lebih sederhana tetapi membutuhkan penyaringan output menggunakan antarmuka dbus stack Unity. Ini pada dasarnya adalah fungsi yang saya miliki di.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] }'
}

Contoh dijalankan:

$ 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

Contoh penggunaan qdbus:

Sergiy Kolodyazhnyy
sumber
1

wmctrl -lbisa menjadi hal yang Anda inginkan. Pertama instal

sudo apt-get install wmctrl

Anda juga dapat menggabungkannya dengan daftar Monitor Sistem, secara default ini menunjukkan "Semua proses saya" yang berarti semua proses yang menjadi milik Anda sebagai pengguna.

Untuk hanya memiliki nama aplikasi, jalankan:

EDIT:

wmctrl -l|awk '{$3=""; $2=""; $1="";  print $0}'
Ruslan Gerasimov
sumber
OP hanya ingin mendapatkan nama aplikasi. Apakah ini mungkin?
Avinash Raj
tidak, saya membuka browser firefox. Perintah Anda menunjukkan 0x03c000b3 0 avinash-Lenovo-IdeaPad-Z500 How list of running applications by command? - Ask Ubuntu - Mozilla Firefoxplus beberapa baris tambahan tentang Desktop, Hud, dll.
Avinash Raj
@AvinashRaj: maaf, saya sedang mengerjakannya, saya akan menambahkan secepatnya satu edisi, terima kasih atas perhatian Anda
Ruslan Gerasimov
@AvinashRaj ini adalah tambahan wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}',, akan menambah jawaban saya. Terima kasih telah menunjukkan.
Ruslan Gerasimov
maaf, tidak akan bekerja untuk saya.
Avinash Raj