কমান্ড লাইনটি ব্যবহার করে কীভাবে চলমান অ্যাপ্লিকেশনগুলির একটি তালিকা পেতে পারি?


8

আমি কেবল চলমান অ্যাপ্লিকেশন যেমন ফায়ারফক্স, জেডিট, নটিলাস ইত্যাদি কমান্ড লাইন ব্যবহার করে তালিকাবদ্ধ করতে চাই।

দ্রষ্টব্য: আমি সমস্ত চলমান প্রক্রিয়া তালিকাবদ্ধ করতে চাই না, কেবলমাত্র এমন অ্যাপ্লিকেশনগুলি চলছে যা বলুন (বলুন ম্যানুয়ালি প্রবর্তিত জিইউআই)।


2
"কেবলমাত্র তালিকা প্রয়োগকারী যা চলছে" আপনার অর্থ কী? সমস্ত অ্যাপ্লিকেশন (প্রক্রিয়া হিসাবেও পরিচিত) চলছে। আপনার অর্থ কেবলমাত্র 'ফায়ারফক্স, সহানুভূতি এবং থান্ডারবার্ড' এর মতো খোলা উইন্ডো বা আপনার ব্যবহারকারীর 'ইউনিটি, কমিজ, জিনোম-টার্মিনাল, অ্যাপটি-গেট' এর মতো সমস্ত প্রক্রিয়া শুরু হয়েছে?
ব্রায়াম

উত্তর:


9

একটি সংমিশ্রণ wmctrlএবং xprop অনেক সম্ভাবনা উপলব্ধ করা হয়।

উদাহরণ 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
}

আউটপুট এই ক্ষেত্রে অনুরূপ দেখতে পারে:

"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

উদাহরণ 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[@]}" 
}

আউটপুট উদাহরণ:

Firefox
Geany
Gnome-terminal
Mousepad
Thunar
Xfce4-terminal

আপনি আপনার ফাংশনটি যুক্ত করতে পারেন ~/.bashrcবা এটি কোনও স্ক্রিপ্ট ফাইল থেকে চালাতে পারেন।


দুটি কারণে আপ-ভোট দিয়েছেন: (1) এটি আসলে প্রশ্নের উত্তর দিয়েছে; এবং, (২) সবচেয়ে গুরুত্বপূর্ণ, অতিরিক্ত তথ্যের সাথে প্রশ্নটি জটিল করার চেষ্টা করেনি যা খুব স্পষ্টভাবে প্রশ্নের ক্ষেত্রের মধ্যে ছিল না - এই ধরণের তথ্য তাদের (আমাদের) সাহায্য করার চেয়ে ব্যবহারকারীদের আরও বিভ্রান্তি সৃষ্টি করে সমস্যাটি বুঝতে এবং সমাধান করুন।
আলমির ক্যাম্পোস

2

ভূমিকা

শক্তি xdotoolএবং wmctrlআসে আউট যখন আপনি চলন্ত বা মাপ হিসাবে উইন্ডোজ, উপর ম্যানিপুলেশন করতে হবে। যাইহোক, আমি দৃ strongly়ভাবে বিশ্বাস করি যে কেবল চলমান প্রোগ্রামগুলি এবং তাদের সম্পর্কে তথ্য তালিকাভুক্ত করার উদ্দেশ্যে xpropএবং qdbusদুটি পর্যাপ্ত সরঞ্জাম এবং ইনস্টল করা xdotoolএবং wmctrlব্যবহারকারী অতিরিক্ত কার্যকারিতার জন্য এটি না চাইলে - এটি উদ্দেশ্যহীন কাজ। এই উত্তরে আমি xpropএবং সাথে দুটি স্ক্রিপ্টিং সমাধান উপস্থাপন করতে চাই qdbus

নোট করুন আমি কোনওভাবেই xdotoolবা এর বিপক্ষে নই wmctrl। আমি এগুলিকে আমার নিজেরাই ব্যাপকভাবে ব্যবহার করেছি তবে অন্যান্য সরঞ্জামের সাথে মিলিত হয়ে এগুলিকে আমি আরও শক্তিশালী মনে করি। এখানে আমি কয়েকটি ব্যবহার করেছি যেখানে আমি সেগুলি ব্যবহার করেছি:

Xprop

স্ক্রিপ্ট বেলো সক্রিয় উইন্ডোজের তালিকাটি বের করার জন্য কেবল এক্সপ্রপ ব্যবহার করে, কেবলমাত্র সত্য উইন্ডোগুলি ফিল্টার করে (ডক টাইপ নয় যা ইউনিটি লঞ্চার বা ইউনিটি প্যানেল হিসাবে স্তন্যপান করে) এবং তাদের তথ্য প্রদর্শন করে:

ডেমো:

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

স্ক্রিপ্ট উত্স :

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

কোড বেলো মূলত একই কাজটি সম্পাদন করে, তবে এটি প্রথমে অ্যাপ্লিকেশনগুলি ফিল্টার করে, তারপরে বাচ্চাদের উইন্ডো তালিকাভুক্ত করে এবং শেষ পর্যন্ত তাদের সম্পর্কে তথ্য সরবরাহ করে।

নমুনা রান:

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

কোড নিজেই:

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

কিছুটা সহজ কমান্ড তবে আউটপুট ফিল্টারিংয়ের জন্য ইউনিটির উইন্ডো স্ট্যাক ডিবিস ইন্টারফেস ব্যবহার করা হয়। এখানে মূলত আমার একটি ফাংশন রয়েছে.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] }'
}

নমুনা রান:

$ 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

Qdbus ব্যবহারের উদাহরণ:


1

wmctrl -lআপনি চেয়েছিলেন একটি জিনিস হতে পারে। প্রথমে এটি ইনস্টল করুন

sudo apt-get install wmctrl

আপনি এটি সিস্টেম মনিটরের তালিকার সাথেও সংযুক্ত করতে পারেন, ডিফল্টরূপে এটি "আমার সমস্ত প্রক্রিয়া" দেখায় যার অর্থ ব্যবহারকারী হিসাবে আপনার অন্তর্ভুক্ত সমস্ত প্রক্রিয়া।

কেবলমাত্র অ্যাপ্লিকেশনগুলির নাম রাখতে, চালনা করুন:

সম্পাদনা করুন:

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ডেস্কটপ, হুড ইত্যাদি সম্পর্কে অতিরিক্ত কিছু লাইন প্রদর্শন করে ।
অবিনাশ রাজ

@ অবিনাশরাজ: দুঃখিত, আমি এটি নিয়ে কাজ করছি, আমি আপনাদের মনোযোগের জন্য ধন্যবাদ একটি সংস্করণ যোগ করব
রুসলান গেরাসিমভ

@ অভিনশরাজ এটি wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'আমার সংযোজন যুক্ত করবে। নির্দেশ করার জন্য আপনাকে ধন্যবাদ।
রুসলান গেরাসিমভ

দুঃখিত, আমার জন্য কাজ করবে না।
অবিনাশ রাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.