Bagaimana cara mengetahui proses mana yang memiliki set variabel DISPLAY?

8

Kadang-kadang saya menghadapi beberapa masalah di layar dan kebanyakan saya ingin tahu file atau proses mana yang menggunakan variabel lingkungan DISPLAY.

Jadi bagaimana cara mendaftar semua proses yang memiliki DISPLAY ditetapkan?

Maythux
sumber

Jawaban:

13

Saya datang ke perintah ini setelah banyak pencarian dan mencoba:

for file in /proc/[0-9]*; do grep -ao 'DISPLAY=[^[:cntrl:]]*' $file/environ 2>/dev/null && grep -ao '(.*)' $file/stat; done | sed 'N;s/\n/\t/'

Contoh dari output adalah:

DISPLAY=:0  (unity-files-dae)
DISPLAY=:0  (unity-music-dae)
DISPLAY=:0  (unity-lens-vide)
DISPLAY=:0  (zeitgeist-daemo)
DISPLAY=:0  (zeitgeist-fts)
DISPLAY=:0  (zeitgeist-datah)
DISPLAY=:0  (cat)
DISPLAY=:0  (unity-scope-vid)
DISPLAY=:0  (unity-musicstor)
DISPLAY=:0  (dconf-service)
DISPLAY=:0  (gdu-notificatio)
DISPLAY=:0  (telepathy-indic)
DISPLAY=:0  (mission-control)
DISPLAY=:0  (goa-daemon)
DISPLAY=:0  (VBoxXPCOMIPCD)
Maythux
sumber
1
Solusi yang bagus. Bisakah Anda menambahkan penjelasan untuk apa yang terjadi di belakang layar? Juga, hasilnya terpotong, apa yang bisa saya lakukan untuk mendapatkan nama proses penuh?
Danatela
1
Pencarian perintah ini secara rekursif di direktori / proc. grep untuk DISPLAYsetiap file. File-file itu benar-benar dalam proses yang berjalan sehingga setiap file yang mengandung kata DISPLAYberarti bahwa proses ini menggunakannya. Anda tidak bisa mendapatkan nama proses lengkap karena nama-nama dalam output adalah nama file yang didirikan /procsehingga Anda tidak bisa tahu lebih banyak dari yang ditawarkan.
Maythux
1
TOLONG, edit jawaban Anda dan informasikan kepada pengguna bahwa Anda telah memperbarui posting Anda.
Braiam
Saya telah mengacaukan variabel DISPLAY env dan ingin tahu apa nilai-nilai DISPLAY sebelum saya mengubahnya, saya tidak tahu ada commad yang bisa memberi tahu saya tentang sejarahnya, jadi dengan menggunakan perintah ini saya menemukan proses sebelumnya yang memiliki digunakan nilai DISPLAY mana dan masalah saya dipecahkan.
yaxe
1

Dengan sedikit modifikasi pada skrip Maythux, kita juga bisa mendapatkan PID dari proses menggunakan variabel DISPLAY.

for file in /proc/[0-9]*; do grep -ao 'DISPLAY=[^[:cntrl:]]*' $file/environ 2>/dev/null && grep -ao '[0-9]* (.*)' $file/stat; done | sed 'N;s/\n/\t/' |column -t |sort -n -k2

Outputnya adalah:

DISPLAY=:0  590    (lxsession)
DISPLAY=:0  645    (unclutter)
DISPLAY=:0  705    (gvfsd)
DISPLAY=:0  710    (gvfsd-fuse)
DISPLAY=:0  727    (openbox)
DISPLAY=:0  729    (lxpolkit)
DISPLAY=:0  732    (lxpanel)
DISPLAY=:0  734    (pcmanfm)
DISPLAY=:0  772    (menu-cached)
DISPLAY=:0  781    (gvfs-udisks2-vo)
DISPLAY=:0  791    (gvfs-gphoto2-vo)
DISPLAY=:0  795    (gvfs-mtp-volume)
DISPLAY=:0  799    (gvfs-afc-volume)
DISPLAY=:0  804    (gvfs-goa-volume)
DISPLAY=:0  816    (gvfsd-trash)
DISPLAY=:0  21053  (npm)
DISPLAY=:0  21102  (sh)
DISPLAY=:0  21103  (sh)
DISPLAY=:0  21104  (node)
DISPLAY=:0  21110  (electron)
DISPLAY=:0  21112  (electron)
DISPLAY=:0  21149  (electron)
DISPLAY=:0  21154  (electron)
DISPLAY=:0  21180  (rec)
not2qubit
sumber
0

Itulah beberapa skrip baris perintah yang cukup bagus! Saya akan membuat salinan di skrip itu jika saya harus meretasnya untuk mencari sesuatu yang lain.

Idealnya semua proses saat ini yang sesuai dengan program yang Anda jalankan pada mesin lokal, posting login, akan membawa variabel tampilan yang sama dengan konsol pts (sesi semu-terminal) pertama Anda.

Sebagai contoh ketika Anda membuka sesi terminal pertama Anda (gnome-terminal) dan menjalankan perintah who atau w Anda akan melihat beberapa output seperti ini:

$ who

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0)

atau beberapa orang mungkin terlihat seperti ini (tetapi bukan itu kasus Anda)

yourusername   :0        2015-06-08 14:05 (:0)
yourusername   pts/0     2015-06-08 14:22 (:0.0)

menggunakan light display manager jika variabel DISPLAY diatur secara berbeda untuk eksekusi shell setelah masuk (misalnya: 0,0), maka variabel lingkungan untuk DISPLAY akan menghasilkan variabel tampilan yang sama dengan variabel tampilan pasca-masuk dari titik terbuka pertama (: 0,0), tetapi variabel host, saat login, masih tetap (: 0).

Dengan menggemakan variabel DISPLAY, atau menjalankan set piped menjadi kurang seperti yang ditunjukkan di bawah ini:

:~$ echo $DISPLAY

atau

:~$ set | less

Anda juga dapat memeriksa sesi Anda variabel tampilan saat ini, dan melihat apa yang diatur, untuk eksekusi shell setelah posting login. Jadi pada dasarnya variabel tampilan dari proses yang Anda jalankan, akan memiliki variabel tampilan yang sama dengan Poin terbuka pertama Anda, setelah login.

Output dari skrip yang Anda posting, menunjukkan bahwa Poin terbuka pertama Anda akan memiliki variabel tampilan yang sama dengan login manajer tampilan Anda, dalam hal ini: 0.

Sekarang untuk contoh kedua output akan terlihat seperti ini:

DISPLAY=:0.0    (gvfs-udisks2-vo)
DISPLAY=:0.0    (zeitgeist-daemo)
DISPLAY=:0.0    (zeitgeist-fts)
DISPLAY=:0.0    (zeitgeist-datah)
DISPLAY=:0.0    (gvfs-mtp-volume)
DISPLAY=:0.0    (gvfs-gphoto2-vo)
DISPLAY=:0.0    (gvfs-afc-volume)
DISPLAY=:0.0    (geyes_applet2)
DISPLAY=:0.0    (indicator-apple)
DISPLAY=:0.0    (cat)
DISPLAY=:0.0    (python)
DISPLAY=:0.0    (gvfsd-trash)
DISPLAY=:0.0    (indicator-keybo)
DISPLAY=:0.0    (gvfsd-burn)
DISPLAY=:0.0    (cat) 
DISPLAY=:0.0    (cat)
DISPLAY=:0.0    (gnome-terminal)
DISPLAY=:0.0    (bash)
DISPLAY=:0.0    (bash)
DISPLAY=:0.0    (sed)

Juga untuk bacaan tambahan Anda dapat melihat halaman manual untuk ptmx

$ man ptmx

Ini mungkin memberi Anda wawasan tentang hubungan master-slave dari pseudo-terminal.

Saya harap ini membantu!

Di mana Anda mendapatkan skrip itu?

oOpSgEo
sumber