จะทราบได้อย่างไรว่ากระบวนการใดที่มีการตั้งค่าตัวแปร DISPLAY?


8

บางครั้งฉันประสบปัญหาในการแสดงผลและส่วนใหญ่ฉันต้องการทราบว่าไฟล์หรือกระบวนการใดบ้างที่ใช้ตัวแปรสภาพแวดล้อม DISPLAY

ดังนั้นจะแสดงรายการกระบวนการทั้งหมดที่มีการตั้งค่าการแสดงผลได้อย่างไร

คำตอบ:


13

ฉันมาถึงคำสั่งนี้หลังจากค้นหาหลายครั้งและลอง:

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/'

ตัวอย่างของผลลัพธ์คือ:

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)

1
ทางออกที่ดี คุณช่วยเพิ่มคำอธิบายสำหรับสิ่งที่เกิดขึ้นเบื้องหลังได้ไหม นอกจากนี้ผลลัพธ์ยังเป็น cropt ฉันจะทำอย่างไรเพื่อให้ได้ชื่อกระบวนการแบบเต็ม
Danatela

1
คำสั่งนี้ค้นหาซ้ำในไดเรกทอรี / proc grep สำหรับDISPLAYในแต่ละไฟล์ ไฟล์เหล่านั้นอยู่ในกระบวนการทำงานจริง ๆ ดังนั้นทุกไฟล์ที่มีคำDISPLAYว่าหมายความว่ากระบวนการนี้ใช้งานอยู่ คุณไม่สามารถรับชื่อกระบวนการแบบเต็มได้เนื่องจากชื่อในเอาต์พุตเป็นชื่อไฟล์ที่ก่อตั้งขึ้น/procดังนั้นคุณจึงไม่สามารถรู้ได้มากกว่าข้อเสนอ
Maythux

1
โปรดแก้ไขคำตอบของคุณแทนและแจ้งให้ผู้ใช้ทราบว่าคุณได้อัปเดตโพสต์แล้ว
Braiam

ฉันทำผิดพลาด DISPLAY env variable และอยากรู้ว่าอะไรคือค่าของ DISPLAY ก่อนที่ฉันจะเปลี่ยนมันฉันไม่รู้เกี่ยวกับคอมมอนใด ๆ ที่สามารถบอกฉันเกี่ยวกับประวัติของมันดังนั้นโดยใช้คำสั่งนี้ฉันพบกระบวนการก่อนหน้านี้ ใช้ค่า DISPLAY ใดและปัญหาของฉันได้รับการแก้ไข
yaxe

1

ด้วยการดัดแปลงเล็กน้อยเพื่อสคริปต์ Maythux เรายังสามารถรับ PID ของกระบวนการโดยใช้ตัวแปร 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

ผลลัพธ์คือ:

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)

0

นั่นเป็นสคริปต์บรรทัดคำสั่งที่ดีงาม! ฉันจะทำสำเนาที่สคริปต์นั้นในกรณีที่ฉันต้องแฮ็คไฟล์เพื่อคิดอย่างอื่น

กระบวนการปัจจุบันทั้งหมดที่ตรงกับโปรแกรมที่คุณรันบนเครื่องโลคอลโพสต์ล็อกอินจะเป็นการดำเนินการกับตัวแปรการแสดงผลเดียวกับคอนโซล pts (pseudo-terminal session) ที่เปิดครั้งแรกของคุณ

ตัวอย่างเช่นเมื่อคุณเปิดเซสชันเทอร์มินัลแรกของคุณ (gnome-terminal) และเรียกใช้คำสั่ง who หรือ w คุณจะสังเกตเห็นผลลัพธ์บางอย่างเช่นนี้:

$ who

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

หรือคนบางคนอาจมีลักษณะเช่นนี้ (แต่ไม่ใช่กรณีของคุณ)

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

ใช้ light display manager หากตัวแปร DISPLAY ถูกตั้งค่าแตกต่างกันสำหรับการดำเนินการโพสต์เข้าสู่ระบบของเชลล์ (เช่น: 0.0) จากนั้นตัวแปรสภาพแวดล้อมสำหรับ DISPLAY จะให้ตัวแปรการแสดงผลเช่นเดียวกับตัวแปรการแสดงผลหลังการเข้าสู่ระบบ 0.0) แต่ตัวแปรโฮสต์ที่ล็อกอินจะยังคงเป็น (: 0)

ด้วยการสะท้อนตัวแปร DISPLAY หรือการตั้งค่า piped ให้น้อยลงดังแสดงด้านล่าง:

:~$ echo $DISPLAY

หรือ

:~$ set | less

คุณยังสามารถตรวจสอบตัวแปรการแสดงผลเซสชันปัจจุบันของคุณและดูว่ามันถูกตั้งค่าไว้สำหรับการดำเนินการโพสต์เข้าสู่ระบบของเปลือก ดังนั้นโดยทั่วไปแล้วตัวแปรการแสดงผลของกระบวนการที่คุณดำเนินการจะมีตัวแปรการแสดงผลเช่นเดียวกับ pts ที่เปิดครั้งแรกของคุณโพสต์ล็อกอิน

ผลลัพธ์ของสคริปต์ที่คุณโพสต์แนะนำว่า pts ที่เปิดครั้งแรกของคุณจะมีตัวแปรการแสดงผลเหมือนกับการเข้าสู่ระบบของผู้จัดการการแสดงผลของคุณในกรณีนี้: 0

ตอนนี้สำหรับตัวอย่างที่สองเอาต์พุตจะมีลักษณะดังนี้:

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)

นอกจากนี้สำหรับการอ่านเพิ่มเติมคุณสามารถดูหน้าคนสำหรับ ptmx

$ man ptmx

สิ่งนี้อาจทำให้คุณเข้าใจถึงความสัมพันธ์ระหว่างทาสกับเทอร์มินัลเทียม

ฉันหวังว่านี่จะช่วยได้!

คุณไปที่สคริปต์นั้นด้วยที่ไหน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.