Làm thế nào để biết các quá trình có bộ biến HIỂN THỊ được đặt?


8

Đôi khi tôi gặp một số vấn đề trong hiển thị và chủ yếu là tôi muốn biết tập tin hoặc quy trình nào đang sử dụng biến môi trường HIỂN THỊ.

Vậy làm thế nào để liệt kê tất cả các quy trình đã thiết lập HIỂN THỊ?

Câu trả lời:


13

Tôi đã đưa ra lệnh này sau nhiều lần tìm kiếm và thử:

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

Một mẫu của đầu ra là:

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
Giải pháp tốt đẹp. Bạn có thể vui lòng thêm một số lời giải thích cho những gì xảy ra đằng sau hậu trường? Ngoài ra, đầu ra là cropt, tôi có thể làm gì để có được tên quy trình đầy đủ?
Danatela

1
Lệnh này tìm kiếm đệ quy trong thư mục / Proc. grep cho DISPLAYtrong mỗi tập tin. Các tệp đó thực sự đang trong quá trình chạy, vì vậy mọi tệp có chứa từ đó DISPLAYcó nghĩa là quá trình này đang sử dụng nó. Bạn không thể có được tên quy trình đầy đủ vì tên trong đầu ra là tên tệp được thành lập ion /procnên đơn giản là bạn không thể biết nhiều hơn tên được cung cấp.
Maythux

1
Thay vào đó, hãy chỉnh sửa câu trả lời của bạn và chỉ thông báo cho người dùng rằng bạn đã cập nhật bài đăng của mình.
Braiam

Tôi đã làm rối biến env của HIỂN THỊ và muốn biết giá trị của HIỂN THỊ là gì trước khi tôi thay đổi nó, tôi không biết bất kỳ dấu phẩy nào có thể cho tôi biết về lịch sử của nó, vì vậy bằng cách sử dụng lệnh này tôi đã tìm thấy các quy trình trước đó đã sử dụng giá trị HIỂN THỊ và vấn đề của tôi đã được giải quyết.
yaxe

1

Với một sửa đổi nhỏ đối với tập lệnh Maythux, chúng ta cũng có thể nhận được PID của các quy trình bằng cách sử dụng biến HIỂN THỊ.

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

Đầu ra là:

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

Đó là một số kịch bản dòng lệnh khá tiện lợi! Tôi sẽ tạo một bản sao ở kịch bản đó trong trường hợp tôi phải hack nó để tìm thứ khác.

Lý tưởng nhất là tất cả các quy trình hiện tại tương ứng với các chương trình mà bạn thực hiện trên máy cục bộ, đăng nhập bài đăng, sẽ mang cùng một biến hiển thị như bảng điều khiển pts (thiết bị đầu cuối giả) đầu tiên của bạn.

Chẳng hạn, khi bạn mở phiên đầu cuối đầu tiên (gnome-terminal) và chạy lệnh who hoặc w, bạn sẽ thấy một số đầu ra như thế này:

$ who

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

hoặc một số người có thể trông như thế này (nhưng không phải trường hợp của bạn)

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

sử dụng trình quản lý hiển thị ánh sáng nếu biến HIỂN THỊ được đặt khác nhau để thực hiện đăng nhập vỏ (ví dụ: 0,0), thì biến môi trường cho HIỂN THỊ sẽ mang lại biến hiển thị giống như biến hiển thị sau đăng nhập của pts mở đầu tiên (: 0,0), nhưng biến chủ, khi đăng nhập, vẫn sẽ là (: 0).

Bằng cách lặp lại biến HIỂN THỊ hoặc chạy bộ được đặt thành ít hơn như hiển thị bên dưới:

:~$ echo $DISPLAY

hoặc là

:~$ set | less

bạn cũng có thể kiểm tra biến số hiển thị hiện tại của phiên và xem nó được đặt thành gì, để thực hiện đăng nhập shell. Về cơ bản, biến hiển thị của các quá trình bạn thực hiện, sẽ có cùng biến hiển thị với pts mở đầu tiên của bạn, đăng nhập.

Đầu ra của tập lệnh mà bạn đã đăng, cho thấy rằng các pts mở đầu tiên của bạn sẽ có cùng biến hiển thị với thông tin đăng nhập của người quản lý hiển thị của bạn, trong trường hợp này: 0.

Bây giờ cho ví dụ thứ hai, đầu ra sẽ trông giống như thế này:

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)

Ngoài ra để đọc thêm, bạn có thể xem các trang man cho ptmx

$ man ptmx

Điều này có thể cho bạn một cái nhìn sâu sắc về mối quan hệ chủ-nô của các thiết bị đầu cuối giả.

Tôi hi vọng cái này giúp được!

Ngoài ra, bạn đã nhận được kịch bản đó ở đâu?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.