X tarafından atandığım ekran numarasını alma


21

X (7) man sayfalarından

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.

Atandığım ekran numarasını nasıl bulabilirim?

Veya şu anda açık olan ekranları ve kullanıcılarını listelemek?

Yanıtlar:


29

Kullanıcının oturumunda çalışan bir işlem kimliğini biliyorsanız ve bu işlemin bilgilerine erişme izniniz varsa, DISPLAYdeğişken için ortamını kullanabilirsiniz :

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

Örnek olarak, geçerli bilgisayarda UID'niz tarafından kullanılan tüm ana ekranları listelemek için şunu kullanın:

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

Yalnızca bir X oturumunda oturum açtıysanız, yukarıdaki gibi yalnızca bir satır çıktı olmalıdır :0.


Not: Bir hatta bu kullanmak istiyorsan, bir eklemeniz gerekir ;önce done.
not2qubit

@ user1147688 teşekkürler, ancak en azından kullandığım kabuklarda (Bash ve Dash) yeni satır karakteri de işe yarıyor.
Amir

Brillant! Teşekkürler. Bunu bazı geliştirmelerle unix.stackexchange.com/a/429162/12574 için çaldı ;)
Gilles Quenot

11

X oturumunda, DISPLAYgeçerli görüntüleme numarasını ( echo $DISPLAY) almak için ortam değişkenine her zaman başvurabilirsiniz .

Başkalarının ekran numaralarını bulmak daha zordur. Tüm kullanıcılara bağlandıklarını gösteren diğer soruları sormanın dışında standart bir yol olduğunu düşünmüyorum, bu nedenle bu bilgiyi edinme girişimi bir tür hackery gerektiriyor ve tüm durumlar için çalışmayacak.

SE'de başka yerlerde verilen bazı seçenekler var, ancak Debian Wheezy'de çalışmazlar. Ancak, yukarıda bağlandığım yazıda gösterildiği gibi, şu anda etkin olan ekranların listelenmesi kolaydır:

ps axu | grep "X " size şu anda çalışan X işlemlerini gösterecektir, örneğin:

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

İlk parametre /usr/bin/X, iki nokta üst üste işareti ile gösterilen ekran numarasıdır ve sonraki parametre , oturuma atanan sanal terminali gösterir.

Bununla birlikte, işlem listesine bakarak size cevap verebilirsiniz:

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

Sonraki satırlara bakın /usr/bin/X- X oturumu başlarken, genellikle oturumun ait olduğu kullanıcı olarak bir pencere yöneticisi başlatılır ve orada kullanıcı adını alırsınız. Benim durumumda user_1 KDE kullanıyor ve user_2 LXDE kullanıyor. Ancak, bu çözüm yalnızca çekirdeğin yeni işlem kimliklerini artan sırada ataması gerçeğine dayanır, ki bu her zaman böyle olmayabilir.


Teşekkürler, bence cevap DISPLAY'e danışmak. Ancak, DISPLAY değişkeni eski olabilir. Bir ekran oturumuna yeniden bağlanırken bu bana oldu . Grafiksel şeylerin çalışmamasına neden oldu. Bunu sökerek, EKRAN'ı yankılayarak, yeniden takarak ve EKRANI yeni değere ayarlayarak çözdüm.
ricab

Linux her süreç Çok altında ortamı sağlar /proc/$pid/environolduğu gibi cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Başka bir kullanım örneği için cevabıma bakın.
Amir

3

Bu yanıtta who& grep tabanlı tek satırlık

/ubuntu//a/230838/152287

who olarak kısaltılabilir w

değeri almak için bir astar içeren bağlantıda daha fazla bilgi bulabilirsiniz.

İşe yarıyor. Görüntülenen değerin FROM sütununda olduğu raspberrypi (rasbian) çıktısı

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

1

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

termsql bunun gibi bilgileri elde etmek için iyi bir araçtır.

DISPLAY numarasını bulmak örneklerden biridir:

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

(X ikilisinin çağrıldığı varsayılarak, DISPLAY ortam değişkenini şu anda X ekranında çalışmakta olan değere ayarlayın Xorg.bin)


1

Amir'in cevabında küçük bir değişiklik.

ps eher bir komutun ortamını çıktılar, ayrılan alan doğrudan sedDISPLAY'ı filtrelemek için doğrudan geçirilebilir ve doğrudan / proc / PID / environ'ı okumaktan daha basit bir komut verir. (Diğer kullanıcıların ortamlarını okumak için yine de root izinlerine ihtiyacınız vardır.)

Bu kod, X oturumuyla oturum açmış tüm kullanıcıların adlarını ve EKRAN numaralarını verir:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.