GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada perintah linux untuk menentukan ID jendela yang terkait dengan ID proses tertentu?

xwininfo dan xprop memungkinkan untuk mengambil apa yang Anda inginkan, tetapi ini sedikit rumit.

xwininfo mengizinkan untuk mengambil semua jendela yang diketahui, dan xprop untuk meminta X tentang ID jendela tunggal untuk parameter _NET_WM_PID Anda.

Sejauh ini, cara meretas untuk melakukannya adalah:

#!/bin/sh

findpid=$1

known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')

for id in ${known_windows}
do
    xp=$(xprop -id $id _NET_WM_PID)
    if test $? -eq 0; then
        pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')

        if test "x${pid}" = x${findpid}
        then
            echo "Windows Id: $id"
        fi
    fi
done

Hasil:

mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e

Seperti yang akan Anda lihat, satu proses mungkin memiliki sejumlah jendela tertentu, meskipun Anda hanya melihat satu jendela di layar.

Mungkin Anda harus mendapatkan sumber alat ini untuk membuat apa yang Anda inginkan.


Anda dapat mencari PID dengan wmctrl juga, sebenarnya, dan saya pikir itu cara yang lebih baik untuk melakukannya. xwininfo akan mengembalikan semua jenis entitas yang tampak seperti jendela, tetapi Anda tidak akan benar-benar menemukannya di desktop.

Jika Anda melakukan man wmctrl , Anda akan menemukan bahwa wmctrl -l mencantumkan semua jendela yang benar-benar terlihat di desktop Anda dengan (yang paling penting) id jendela mereka dan judul . -p menambahkan PID dan -x akan menambahkan kelas jendela .

Seperti yang dikatakan manual ( RTFM, kan? :D), wmctrl juga dapat mencari melalui beberapa di antaranya dan mengaktifkan jendela yang cocok dengan pencarian. Namun, saya tidak tahu apa yang menentukan mana dari semua kecocokan yang mungkin akan dikembalikan. Di sisi lain, Anda dapat menggunakan fungsi daftar yang disediakan untuk menulis pembungkus yang melakukan pencarian dengan lebih baik dan mungkin berdasarkan beberapa properti lain (seperti stempel waktu dari akses terakhir ke jendela) yang dapat Anda peroleh dengan menanyakan menangkan id ke xprop, misalnya.

Baris-baris kode di bawah ini mengembalikan contoh terbaru jendela kelas mate-terminal:

XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm    #save tmp files to memory to make it faster
LST=`mktemp`              #tmp file to store our listing 
wmctrl -lx |  awk -F' ' '{printf("%s\t%s    \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n")  }'  > $LST #pretty-print our listing of windows into the tmp file
 #To each line of listing, prepend a timestamp acquired via an xprop call
 #Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`;  TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST ) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST  #delete tmp file

Bagaimanapun, untuk hal yang Anda gambarkan sedang Anda bangun—jika saya jadi Anda, saya akan mencari tahu kelas jendela apa yang dihasilkan oleh perintah yang Anda inginkan dan kemudian mendasarkan pencarian saya pada itu, bukan pada PID. Alternatifnya, Anda dapat berasumsi bahwa perintah CMD mungkin akan menghasilkan jendela dengan nama kelas yang menyertakan CMD.

Setelah Anda menemukan baris Anda, Anda harus menggunakan id jendela
untuk mengaktifkan jendela melalui wmctrl.

Semoga ini bisa membantu.

Catatan tambahan:Saya menemukan bahwa xdotool juga dapat melakukan pencarian berdasarkan nama kelas dan judul jendela, tetapi sangat lambat . Di komputer saya, skrip bash ini (yang memanggil beberapa utilitas eksternal) 10 kali lebih cepat dari alternatif yang dikompilasi yaitu xdotool :P.


Anda dapat menggunakan:

xdotool getwindowfocus getwindowname

(Seperti:Anda tidak perlu mengganti nama yang terdengar bagus itu dengan apa pun.)


Linux
  1. Menjadwalkan tugas dengan perintah cron Linux

  2. Diagnosis masalah konektivitas dengan perintah ping Linux

  3. Tonton perintah dan tugas dengan perintah jam tangan Linux

  1. Ganti kutipan pintar dengan perintah sed Linux

  2. Memulai dengan perintah tac Linux

  3. Memulai dengan perintah cat Linux

  1. Periksa status file di Linux dengan perintah stat

  2. Jadwalkan tugas dengan Linux pada perintah

  3. Sembunyikan file tersembunyi Linux di Windows