コマンドラインを使用して、Firefox、gedit、Nautilusなどの実行中のアプリケーションのみを一覧表示したい。
注:実行中のすべてのプロセスをリストするのではなく、実行中のアプリケーション(たとえば、手動で起動したGUI)のみをリストします。
コマンドラインを使用して、Firefox、gedit、Nautilusなどの実行中のアプリケーションのみを一覧表示したい。
注:実行中のすべてのプロセスをリストするのではなく、実行中のアプリケーション(たとえば、手動で起動したGUI)のみをリストします。
回答:
との組み合わせにより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
か、スクリプトファイルから実行できます。
移動やサイズ変更などのウィンドウの操作を実行する必要があるときに、xdotool
との威力が発揮wmctrl
されます。しかし、私は強くのみの目的のためにと信じ上場それらについての実行中のプログラムや情報を、xprop
そしてqdbus
2つの十分なツールであり、インストールするxdotool
とwmctrl
、ユーザーは、追加機能のためにそれらを望んでいない限り-無目的タスクです。この答えでは、私は2つのスクリプトソリューションを提示したいxprop
とqdbus
。
私は決してxdotool
やに反対しているわけではないことに注意してくださいwmctrl
。私自身もこれらを幅広く使用しましたが、他のツールと組み合わせるとより強力になります。以下は、私がそれらを使用したいくつかの例です。
以下のスクリプトは、xpropのみを使用してアクティブウィンドウのリストを抽出し、真のウィンドウのみをフィルタリングして(UnityランチャーまたはUnityパネルとしてドックタイプのサックを除く)、それらの情報を表示します。
デモ:
$ 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
以下のコードは基本的に同じタスクを実行しますが、最初にアプリケーションを除外し、次にその子ウィンドウを一覧表示し、最後にそれらに関する情報を提供します。
サンプル実行:
$ 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
少し単純なコマンドですが、出力のフィルタリングが必要な場合は、Unityのウィンドウスタックdbusインターフェイスを使用します。これは本質的に私が私の中に持っている機能です.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の使用例:
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
と、デスクトップ、Hudなどに関するいくつかの追加行が表示されます。
wmctrl -l|awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'
追加です、私の答えに追加されます。ご指摘ありがとうございます。