liệt kê các quy trình đồ họa từ thiết bị đầu cuối


7

Đừng nhầm lẫn câu hỏi ở đây với cách liệt kê các quy trình đồ họa, đó không phải là điều tôi đang hỏi.

Trong Terminal, làm thế nào tôi có thể thấy các quá trình có GUI? như trong những thứ như firefox, vlc, geany, nautilus v.v ... tất cả đều có gui. Tôi muốn biết thêm thông tin về quy trình nào đang sử dụng tài nguyên của trình quản lý cửa sổ và tôi muốn thực hiện điều đó từ thiết bị đầu cuối.

Làm thế nào để tôi có thêm thông tin về các loại quy trình?

Tôi đã cố gắng sử dụng pslệnh, nhưng tôi sẽ giải trí bất kỳ lệnh đầu cuối nào để giúp tôi giải quyết vấn đề này.

CẬP NHẬT: Tôi thấy một cái gì đó tôi thích trong pstree đó là cây mà tất cả quá trình đồ họa tôi quan tâm được sinh ra từ:

$ pstree
bắt đầu
     │
     ├─lightdm─┬─Xorg
     │ ─lightdm─┬─init─┬─
     │ │ │ fire─firefox───55 * [{firefox}]
     │ │ │ ─geany─┬─bash
     │ │       
     │ │ │ ─gnome-terminal─┬─bash───pstree



Có thể với pstree
jcbermu 11/03/2015

1
Để làm rõ, chính xác ý bạn là gì khi "có GUI"? Ví dụ, xterm hoặc gnome-terminal là các máy khách X sử dụng tài nguyên X và được quản lý bởi trình quản lý cửa sổ của bạn, nhưng thật khó để tranh luận rằng chúng thực sự có GUI.
jamesqf

Hãy tưởng tượng bạn nhấn alt + tab. Một danh sách nhỏ các ứng dụng xuất hiện, tất cả chúng đều là các ứng dụng đồ họa, Chúng không phải là những thứ như các applet của bảng điều khiển. Tôi đang tìm kiếm một cách lập trình để xác định các ứng dụng đó, để sử dụng trong các kịch bản shell. Có các chương trình khác đang chạy, như các quy trình, tôi đang tìm cách xác định thành phần cửa sổ của một ứng dụng, với một tập lệnh shell. Tại thời điểm này ID cửa sổ có vẻ như đặt cược tốt nhất. Tôi không phán quyết là lựa chọn tốt nhất hoặc duy nhất, tôi hỏi: "làm thế nào để tôi có thêm thông tin về các chương trình đang chạy với giao diện người dùng đồ họa"
j0h

Chính xác, một số quy trình có thể có GUI được hiển thị trên một số màn hình oter X, giống như một máy tính khác qua mạng. Khi sử dụng phần cứng đầu cuối X nhẹ, tất cả các chương trình đều có GUI hiển thị trên máy tính khác. (Tìm kiếm các chương trình có GUI trên màn hình X hiện tại sẽ giải quyết nó và làm những gì bạn có thể hiểu nhất. Màn hình X cần được biết trong thiết bị đầu cuối ($ HIỂN THỊ, thường là: 0,0) cho việc này, điều này có thể khó khăn trong một công việc định kỳ hay như vậy.)
Volker Siegel

Câu trả lời:


6

Hãy thử xrestophoặc xrestop -b.

Nó được dự định để đo bao nhiêu tài nguyên X mà mỗi cửa sổ X tiêu thụ, nhưng như một phần thưởng nhỏ xác định tên của các cửa sổ và các PID tương ứng.


nó rất gần để được mát mẻ Nhưng nó cũng cho tôi một ý tưởng, rằng thông tin tôi muốn có thể là một phần của X
j0h

3
@ j0h Chà ... cố gắng xác định ý nghĩa của việc "có GUI". Cuối cùng, điều đó có nghĩa là quá trình này đang gửi một số lệnh đến máy chủ GUI của HĐH để hiển thị một số cửa sổ. X là máy chủ hiển thị cho các hệ thống linux, do đó tất cả các quy trình với GUI bằng cách nào đó "sử dụng" X. Thực sự không có sự khác biệt thực sự giữa GUI và quy trình không phải GUI từ quan điểm của hạt nhân, và như vậy không có gọi hệ thống đơn giản để xác định xem một quy trình có GUI hay không.
Bakuriu 11/03/2015

6

xlsclientslà gần (và một phần tiêu chuẩn của X), nó liệt kê các máy khách của máy chủ X. Nhưng , có thể không có ánh xạ 1: 1 giữa những gì bạn coi là "ứng dụng" và thứ X coi là "máy khách". Ví dụ chạy LyX duy nhất của tôi tiêu thụ 13 ứng dụng khách, ví dụ, nếu tôi sử dụng xlsclients -l(đầu ra dạng dài) tôi chỉ có thể thấy một trong số họ có "Tên biểu tượng" được xác định, nhưng đây chỉ là một gợi ý. Ngoài ra, vì nó sử dụng XQueryTree()nên nó có thể bỏ lỡ một số cửa sổ (nó không tìm thấy bất kỳ xpdfcửa sổ nào tôi mở).

Nó cũng không cung cấp nhiều thông tin, những gì bạn có thể làm là sử dụng xlsclients -lđể lấy id cửa sổ và truy vấn từng cửa sổ xprop -id $ID. Để biết thêm chi tiết về một cửa sổ, hãy sử dụng xwinifo, mặc dù nó quan tâm đến "các cửa sổ" không giống với ứng dụng khách hoặc ứng dụng:

xwininfo -root -children
xwininfo -root -tree  # indented view

Tùy thuộc vào trình quản lý cửa sổ của bạn, bạn có thể kiểm tra các thuộc tính cửa sổ nhất định (ví dụ: _NET_xxxhoặc _NET_WM_xxxx thuộc tính ) để xác định xem có thứ gì đó là "ứng dụng" không. Nếu máy khách trình quản lý cửa sổ hoặc thư viện GUI đặt nó (bất kỳ cái nào hiện đại nên) thì thuộc _NET_WM_PIDtính là cách đơn giản nhất ( mặc dù không hoàn hảo ) để liên kết một PID với một cửa sổ cụ thể. Tôi không biết về một công cụ liên kết tất cả các phần này lại với nhau.

Tôi sử dụng trình quản lý cửa sổ FVWM, tôi có thể nói chuyện trực tiếp với nó bằng cách sử dụng FvwmCommand, ví dụ: FvwmCommand -i1 send_windowlisthiển thị cho tôi danh sách các cửa sổ. Đề xuất sử dụng của @Arkadiusz wmctrlcó vẻ như là một cách bất khả tri và quản lý cửa sổ để làm điều tương tự.

Một mẹo nữa là truy vấn cửa sổ gốc _WIN_CLIENT_LIST, thông qua bash:

$ xwininfo -root 
xwininfo: Window id: 0x69 (the root window) (has no name)
[..]

$ IFS=",= " read -a win < <(xprop -notype -id 0x69 32x  _WIN_CLIENT_LIST )

$ for ((ww=1; ww<${#win[*]}; ww++)); do 
    printf "%i %s\n" $ww ${win[$ww]};  
    xprop -id ${win[ww]} -notype _NET_WM_PID WM_NAME WM_CLASS \
                                 WM_ICON_NAME WM_CLIENT_LEADER; 
  done

Điều này hoàn toàn khớp với những gì WM của tôi liệt kê dưới dạng cửa sổ (không có những cái tôi đã cấu hình để loại trừ khỏi danh sách cửa sổ WM). Các cửa sổ con được đặt thành WM_CLIENT_LEADERcha mẹ của chúng (để quản lý phiên ), mặc dù cửa sổ cha mẹ có thể không hiển thị (firefox thực hiện điều này) và có thể trỏ đến chính nó.

xrestop được bình chọn của tôi mặc dù.


4

Ngoài ra, nếu bạn đang sử dụng trình quản lý cửa sổ tương thích EWMH , bạn có thể wmctrldùng thử. Nó có thể liệt kê tất cả windows being managed by the window manager+ PID của họ:

$ wmctrl  -lp | awk  '{ print $3 }' | sort | uniq
15672
19685
19925
26247
6884

2

Vâng, bạn cần X cho việc này. Nhưng tôi không biết về một công cụ vượt trội này.

Một ứng dụng có GUI là máy khách trên máy chủ X cục bộ. Nhưng, một máy khách trên máy chủ X cục bộ không nhất thiết phải là một ứng dụng có GUI. Ngoài ra, một máy khách trên máy chủ X cục bộ không nhất thiết phải là một quy trình cục bộ và một quy trình cục bộ với GUI cũng có thể là một máy khách trên máy chủ X từ xa.

Tôi nghĩ rằng bạn sẽ gần gũi với xlsclientshoặc xlsclients -a. Với -ltùy chọn, nó cũng sẽ cung cấp cho bạn (trong số những thứ khác) ID cửa sổ. Nhưng nó không thể cung cấp cho bạn PID. X nói chung, không biết điều đó.

Suy ngẫm: Với quyền truy cập root, bạn có thể grep qua lsofđầu ra để xem các quá trình (cục bộ!) Truy cập vào (các) máy chủ X (cục bộ!). Vì vậy, có lẽ có một số công cụ ra khỏi đó đã làm điều này? Tôi không biết.


Điều này có lẽ hoàn toàn không liên quan, nhưng Alt + Tab hoạt động như thế nào?
j0h

@ j0h Để chuyển đổi giữa các cửa sổ? Điều đó sẽ được xử lý bởi người quản lý cửa sổ. Trừ khi bạn bằng cách nào đó làm việc mà không có trình quản lý cửa sổ, hãy để trình quản lý cửa sổ thực hiện việc này. Nếu bạn muốn thực hiện Alt + Tab từ tập lệnh, hãy đọc cách kiểm soát trình quản lý cửa sổ của bạn (Tôi không tin rằng bạn đã cho chúng tôi biết bạn đang sử dụng?) Từ tập lệnh.
Sidhekin 11/03/2015

lsofcó thể liệt kê các socket miền unix hoặc trừu tượng, nhưng không thể biết chúng kết nối với cái gì.
Stéphane Chazelas

@ StéphaneChazelas Xấu của tôi. Tôi nghĩ rằng có thể kết hợp một cái gì đó như NODE hoặc DEVICE (địa chỉ) để xem hai đầu nào được kết nối. Không phải vậy.
Sidhekin

1
Sử dụng tập lệnh đóperl , trên Linux, bạn có thể làm sudo lsof -aUc Xorg | sudo that-scriptđể liệt kê các máy khách cục bộ bằng cách sử dụng các ổ cắm unix / trừu tượng. sudo lsof -ai tcp -c Xorgđể liệt kê các máy khách sử dụng ổ cắm TCP.
Stéphane Chazelas 17/03/2015
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.