Cara mendapatkan nomor tampilan yang saya ditugaskan oleh X

20

Dari X (7) halaman manual

DISPLAY NAMES
       From the user's perspective, every X server has a display name of the form:

                                  hostname:displaynumber.screennumber
[...]

displaynumber
    [...]
    To avoid confusion, each display on a machine is assigned a display
    number (beginning at 0) when the X server for that display is started.

Bagaimana saya dapat menemukan nomor tampilan yang telah saya tetapkan?

Atau daftar saat ini menampilkan terbuka dan penggunanya?

ricab
sumber

Jawaban:

29

Jika Anda mengetahui satu ID proses yang berjalan di sesi pengguna, dan Anda memiliki izin untuk mengakses informasi proses itu, Anda dapat memahami lingkungannya untuk DISPLAYvariabel:

cat /proc/$pid/environ | tr '\0' '\n' | grep '^DISPLAY='

Sebagai contoh, untuk mencantumkan semua tampilan utama yang digunakan oleh UID Anda di komputer saat ini, gunakan:

ps -u $(id -u) -o pid= | \
    while read pid; do
        cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | grep '^DISPLAY=:'
    done | grep -o ':[0-9]*' | sort -u

Jika Anda hanya masuk ke satu sesi X, yang di atas seharusnya hanya menghasilkan satu baris dengan sesuatu seperti :0.

Amir
sumber
Catatan: Jika Anda ingin menggunakan ini pada satu baris, Anda perlu menambahkan ;sebelum done.
not2qubit
@ user1147688 terima kasih, tetapi karakter baris baru berfungsi dengan baik, setidaknya di shell yang saya gunakan (Bash dan Dash).
Amir
Cemerlang! Terima kasih. Saya mencuri ini untuk unix.stackexchange.com/a/429162/12574 dengan beberapa peningkatan;)
Gilles Quenot
11

Dalam sesi X, Anda selalu dapat berkonsultasi dengan DISPLAYvariabel lingkungan untuk membuat Anda mendapatkan nomor tampilan saat ini ( echo $DISPLAY).

Mengetahui nomor layar orang lain lebih sulit. Saya tidak berpikir ada cara standar untuk mendapatkan informasi selain meminta semua pengguna yang terhubung dengan display mereka, jadi setiap upaya untuk mendapatkan informasi ini memerlukan semacam peretasan dan tidak akan berfungsi untuk semua kasus.

Ada beberapa opsi yang diberikan di tempat lain di SE tetapi mereka tidak akan berfungsi pada Debian Wheezy, misalnya. Namun, daftar tampilan saat ini aktif mudah, seperti yang ditunjukkan pada pos yang saya tautkan di atas:

ps axu | grep "X " akan menunjukkan kepada Anda proses X yang sedang berjalan, sesuatu seperti berikut ini:

root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:58 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a

Parameter pertama setelahnya /usr/bin/Xadalah nomor tampilan yang diawali dengan titik dua, dan yang berikutnya menunjukkan Anda terminal virtual yang ditugaskan untuk sesi.

Anda mungkin mendapatkan jawaban dari melihat daftar proses, meskipun:

ps axu |grep -3 "X "

root      1990  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1991  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1992  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      2359  0.0  0.0   5264  2228 ?        S    Sep15   0:00 -:1            
user_1     2378  0.0  0.0   4920  1348 ?        Ss   Sep15   0:00 /bin/sh /usr/bin/startkde
user_1     2443  0.0  0.0   3868   348 ?        Ss   Sep15   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-kde-session
--
root      7500  0.0  0.0   6460  1080 ?        Ss   Sep14   0:00 /usr/sbin/sshd
ntp       7841  0.0  0.0   5352  1760 ?        Ss   Sep14   0:17 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:111
root      7882  0.0  0.0   3964   716 ?        Ss   Sep14   0:00 /usr/bin/kdm -config /var/run/kdm/kdmrc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:59 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
root      7906  0.0  0.0   5260  2224 ?        S    Sep14   0:00 -:0            
user_2    7925  0.0  0.0  12924  1560 ?        Ssl  Sep14   0:00 /usr/bin/lxsession -s LXDE -e LXDE
user_2    7990  0.0  0.0   3868   348 ?        Ss   Sep14   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/startlxde

Lihatlah baris setelah /usr/bin/X- saat sesi X dimulai, manajer jendela biasanya dimulai sebagai pengguna milik sesi, dan di sana Anda mendapatkan nama pengguna. Dalam kasus saya, user_1 menggunakan KDE dan user_2 menggunakan LXDE. Namun, solusi ini sepenuhnya bergantung pada kenyataan bahwa kernel sedang menugaskan ID proses baru dalam urutan menaik, yang mungkin tidak selalu demikian.

zagrimsan
sumber
Terima kasih, berkonsultasi DISPLAY adalah jawabannya, saya pikir. Namun, variabel DISPLAY mungkin sudah usang. Ini terjadi pada saya ketika memasang kembali sesi layar . Ini menyebabkan hal-hal grafis tidak berfungsi. Saya menyelesaikannya dengan melepaskan, menggema DISPLAY, memasang kembali, dan mengatur DISPLAY ke nilai baru.
ricab
Linux memperlihatkan lingkungan dari setiap proses di bawah /proc/$pid/environ, seperti pada cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Lihat jawaban saya untuk contoh penggunaan lain.
Amir
2

Jawaban ini memiliki satu baris, berdasarkan who& grep

/ubuntu//a/230838/152287

who dapat disingkat w

Anda dapat membaca lebih lanjut di tautan termasuk garis satu untuk mendapatkan nilai.

Berhasil. Berikut ini adalah raspberrypi (rasbian) output, di mana nilai tampilan di kolom FROM

tim@raspberrypi:~ $ w
 19:19:30 up  8:15,  2 users,  load average: 0.12, 0.11, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty7     :0               11:04    8:15m  1:15   0.89s /usr/bin/lxsess
tim      pts/0    192.168.0.29     19:17    0.00s  1.00s  0.09s w
Tim Richardson
sumber
1

https://gitorious.org/termsql/pages/Home

termsql adalah alat yang baik untuk mengekstraksi informasi seperti itu.

Menemukan nomor DISPLAY adalah salah satu contohnya:

export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")

(setel variabel lingkungan DISPLAY ke tampilan X yang sedang berjalan saat ini, dengan asumsi bahwa biner X dipanggil Xorg.bin)

Ano
sumber
1

Variasi kecil pada jawaban Amir.

ps eakan menampilkan lingkungan masing-masing perintah, ruang yang dipisahkan sehingga dapat diteruskan langsung ke seduntuk menyaring DISPLAY, memberikan perintah yang lebih sederhana daripada membaca / proc / PID / environment secara langsung. (Namun, untuk membaca lingkungan pengguna lain, Anda masih memerlukan izin root.)

Kode ini akan menampilkan nama semua pengguna yang masuk dengan sesi X, dan nomor TAMPILAN mereka:

#!/bin/bash
declare -A disps usrs
usrs=()
disps=()

for i in $(users);do
    [[ $i = root ]] && continue # skip root
    usrs[$i]=1
done # unique names

for u in "${!usrs[@]}"; do
    for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
done
Johnraff
sumber