Tôi có Ubuntu trên máy của mình và tôi đang chạy trình quản lý cửa sổ tuyệt vời trên đầu trang. Làm cách nào để kiểm tra thiết bị đầu cuối nào tôi đang chạy? Có một lệnh cho nó?
Tôi có Ubuntu trên máy của mình và tôi đang chạy trình quản lý cửa sổ tuyệt vời trên đầu trang. Làm cách nào để kiểm tra thiết bị đầu cuối nào tôi đang chạy? Có một lệnh cho nó?
Câu trả lời:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Giá trị của pid
sau này có thể được truyền cho ps -p <pid> -o args
lệnh.Về mặt kỹ thuật, đối với trình giả lập thiết bị đầu cuối, bạn thậm chí không cần một lệnh, như đã nêu trong các bình luận :
bạn có ý gì Nhấp vào Trợ giúp -> Giới thiệu có phải vậy không? - JoKeR
Điều đầu tiên chúng ta cần phải làm rõ là chính xác những gì đang được yêu cầu - tìm ra shell đang chạy hoặc thiết bị đầu cuối đang chạy. Thông thường hai thuật ngữ này được sử dụng thay thế cho nhau, nhưng chúng là những thứ khác nhau hoàn toàn. Shell là trình thông dịch dòng lệnh, cụ thể shell tương tác là trường văn bản cộng với dấu nhắc nơi bạn nhập lệnh. Shell cũng có thể không tương tác, ví dụ tập lệnh bắt đầu shell không tương tác hoặc bash -c 'echo hello world'
cũng bắt đầu shell không tương tác.
Ngược lại, terminal là giao diện cho shell (mặc dù nó cũng có thể là một ứng dụng khác). Thiết bị đầu cuối ban đầu được gọi là phần cứng thực tế, nhưng ngày nay chúng chủ yếu là phần mềm. Những gì bạn thấy khi nhấn Ctrl+ Alt+ thoặc nhấp vào biểu tượng thiết bị đầu cuối trong GUI, khởi động trình giả lập thiết bị đầu cuối, cửa sổ bắt chước hành vi của phần cứng và trong cửa sổ đó bạn có thể thấy trình bao chạy. Ctrl+ Alt+ F2(hoặc bất kỳ phím nào trong số 6 phím chức năng) sẽ mở bảng điều khiển ảo, aka tty
. Tôi khuyên bạn nên đọc Tại sao lại là một thiết bị đầu cuối ảo ảo ảo, và thiết bị đầu cuối thực sự là gì? để biết thêm thông tin về các chi tiết cụ thể.
Mỗi người dùng có một vỏ mặc định được gán cho họ trong /etc/passwd
tên người dùng của họ. Giả sử bạn đang sử dụng cấu hình mặc định và chưa gọi một shell khác một cách rõ ràng như một lệnh, điều đó là đủ để làm:
echo $SHELL
Nhưng tất nhiên điều này chỉ hiển thị giá trị mặc định . Giả sử chúng ta làm như sau:
user@ubuntu:~$ dash
$
Chúng tôi là ban đầu trong bash
, nhưng bắt đầu phiên tương tác của /bin/dash
, POSIX Ubuntu hoặc vỏ hệ thống . Biến $SHELL
sẽ không thay đổi, vì đó không phải là mục đích của nó - nó hiển thị mặc định không phải giá trị hiện tại. Chúng ta sẽ cần tiếp cận vấn đề này từ một góc nhìn khác - viễn cảnh của một quá trình, đó là điều mà tôi đã đề cập trong Tôi đang sử dụng bash hay sh?
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
Ở đây chúng tôi tận dụng /proc/
hệ thống tập tin. Tên của quá trình và các tham số dòng lệnh được hiển thị trong /proc/<pid>/comm
. Tất cả những gì chúng ta cần là cung cấp PID của shell, đó là những gì $$
hiện có. Trong ví dụ trên tôi đang thêm nó một cách riêng biệt, nhưng không có gì ngăn chúng tôi làm
cat /proc/$$/comm
Sự thay đổi về chủ đề cũng có thể là
ps -p $$ -o args
Một cách khác chúng ta có thể tiếp cận điều này là thông qua kiểm tra ở đâu /proc/<pid>/exe
. Tệp này là một liên kết tượng trưng cho tệp thực thi. Như vậy chúng ta có thể làm
user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1255/exe -> /bin/dash
Một trong hai cách tiếp cận hoạt động trong 99% các trường hợp. Tất nhiên, có những cách mà họ có thể bị lật đổ. Ví dụ, liên kết tượng trưng sẽ không chỉ bất cứ nơi nào nếu thực thi đã bị xóa ngay sau khi vỏ bắt đầu (và trong trường hợp đó có thể bạn sẽ gặp phải các vấn đề hệ thống, kể từ khi loại bỏ /bin/sh
, /bin/dash
hoặc thậm chí /bin/bash
là không được khuyến khích - sau khi tất cả rất nhiều kịch bản dựa vào họ , đặc biệt là những cấp độ hệ thống). Tên lệnh cho shell thường được đặt làm đối số đầu tiên trong execve()
syscall. Điều này được đề cập trong Làm thế nào để bash biết nó đang được gọi như thế nào? , vì vậy nếu bạn có một ứng dụng khởi chạy shell execve()
, nó có thể đặt cho nó bất kỳ tên nào. Nhưng đây là những điều không chuẩn và không điển hình, nên tránh vì sự nhất quán và bảo mật.
Chúng ta có thể bắt đầu với các biến môi trường. Nhiều thiết bị đầu cuối dường như tự che dấu là không xterm
tương thích, được báo cáo bởi echo $TERM
hoặc echo $COLORTERM
. Nhưng sau đó các biến môi trường không phải là công cụ rất đáng tin cậy. Chúng có thể được đặt và bỏ đặt. Chúng ta có thể làm lại điều tương tự với các bộ vi xử lý một lần nữa, ngoại trừ lần này chúng ta sẽ xem xét bộ cha mẹ. Như bạn có thể nhớ, terminal là giao diện của shell và thường tự khởi động shell. Do đó, chúng ta có thể tìm ra quy trình nào là quy trình cha của shell của chúng ta:
$ ps -p $$ -o args,ppid
COMMAND PPID
bash 1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server
Hãy thử với một ứng dụng đầu cuối khác , sakura
:
$ ps -p $$ -o args,ppid
COMMAND PPID
/bin/bash 16950
$ ps -p 16950 -o args
COMMAND
sakura
Từ đó chúng ta có thể thấy rằng những gì bắt đầu vỏ này là gnome-terminal
. Phương pháp này tất nhiên hoạt động giả sử bạn đang làm việc với vỏ tương tác. Ví dụ, nếu chúng tôi đang cố gắng tìm ra cha mẹ của bash -c '...'
hoặc trình bao bắt đầu thông qua ssh
, thì rất có thể PID là từ ứng dụng không đầu cuối và có thể không phải là GUI.
Vì vậy, nếu chúng ta muốn đối phó cụ thể với thiết bị đầu cuối GUI, những gì chúng ta có thể làm là chạy xprop
, nhấp vào cửa sổ mong muốn, grep pid của nó và tìm hiểu tên của quy trình đó phù hợp với quy trình nào. Hay nói cách khác:
$ ps aux | grep $(xprop | awk -F'=' '/PID/ {print $2}')
xieerqi 2124 0.6 1.7 208068 34604 ? Sl 18:47 1:49 gnome-terminal
Ngoài ra, theo thông số kỹ thuật , người quản lý cửa sổ nên đặt thuộc WM_CLASS
tính. Vì vậy, chúng ta cũng có thể có được điều đó từ xprop
:
$ xprop WM_CLASS
WM_CLASS(STRING) = "sakura", "Sakura"
Tất nhiên, điều này cũng có 1% nhược điểm: thiết lập WM_CLASS
các thuộc tính phụ thuộc vào trình quản lý cửa sổ làm điều đó và PID không được đảm bảo cho một cửa sổ chính xác (xem Quá trình nào tạo ra cửa sổ X11 này? ), Có thể liên quan đến việc gỡ lỗi phức tạp. Và đây không phải là những thiếu sót của các phương thức mà là của máy chủ X11. Tuy nhiên, hầu hết các trình quản lý cửa sổ ổn định và nổi tiếng (như openbox, Metacity, blackbox) và hầu hết các ứng dụng đều hoạt động tốt, vì vậy chúng ta không nên mong đợi các vấn đề với thứ gì đó như Gnome Terminal hoặc Terminator.
Nhưng khi nói đến trình giả lập thiết bị đầu cuối GUI, chúng ta thậm chí không cần tìm lệnh. Chúng ta chỉ có thể sử dụng About
hộp thoại của chính cửa sổ. Ngoại lệ cho quy tắc đó là xterm
.
$SHELL
, chắc chắn
ps | grep
? ps -p $$
! Hoặc, chỉ cho lệnh , ps -p $$ -o cmd=
.
ps | grep
chỉ là hình thức tồi tệ. Hầu hết những gì bạn có thể grep, thực sự có thể được lấy bằng ps
chính nó hoặc bằng các công cụ khác.
Phiên bản ngắn (thx @Serg )
cat /etc/alternatives/x-terminal-emulator
Phiên bản dài
sudo update-alternatives --config x-terminal-emulator
và tìm kiếm *
trong đầu ra
;)
Ví dụ đầu ra
There are 7 alternatives which provide `x-terminal-emulator’.
Lựa chọn thay thế Giữa chúng tôi và 1 / usr / bin / xterm 2 / usr / bin / uxterm 3 / usr / bin / koi8rxterm 4 / usr / thùng / lxterm * + 5 /usr/bin/gnome-terminal.wrapper 6 / usr / thùng / konsole 7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:
Hoặc, nhờ @muru , đây là đầu ra chi tiết hơn
$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
hoặc update-alternatives: error: unknown argument
hoặcconfigconfig'`
--config
sudo
. Sử dụngupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
để có được mục tiêu của liên kết tượng trưng này thay vì sử dụng cat
nó. Các file
tiện ích nên được cài đặt trên hầu hết các hệ thống và có thể được sử dụng để tìm ra mục tiêu thực thi. cat
trên liên kết tượng trưng có thể in bất kỳ tập lệnh shell hoặc thậm chí tệp nhị phân tùy thuộc vào mục tiêu của liên kết này (tập lệnh shell cho gnome-terminal
, tệp nhị phân urxvt
, v.v.).
Nếu bạn muốn biết chương trình đầu cuối bạn đang sử dụng, hãy sử dụng:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
Chạy nó ngay sau khi mở terminal (shell) mà không cần thêm bất kỳ trường hợp shell nào nữa .
Khi bạn mở chương trình đầu cuối, về cơ bản nó sẽ sinh ra một chương trình con, một trình bao. Vì vậy, cha mẹ của vỏ sinh sản là thiết bị đầu cuối chính nó. Nói cách khác, PPID của shell là PID của chương trình đầu cuối.
Ở đây chúng tôi đang tìm ID tiến trình cha (PPID) của shell ( bash
) ps -o 'ppid=' -p $$
, đây sẽ là ID tiến trình của chương trình đầu cuối.
Sau đó, chúng tôi đang tìm tên quy trình từ PID:
$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal
Nó về cơ bản là một lớp lót của:
$ ps -o 'ppid=' -p $$
2268
$ ps -o 'cmd=' -p 2268
gnome-terminal
sshd: username@pts/4
. Lưu ý Tôi đang sử dụng PuTTY để kết nối với máy. Có sshd
thực sự là trình giả lập thiết bị đầu cuối?
Nhập printenv
từ cửa sổ đầu cuối để xem tất cả các biến của phiên mở.
Nhập echo $COLORTERM
từ cửa sổ đầu cuối. LƯU Ý: điều này không hoạt động với tất cả các thiết bị đầu cuối, một như sakura
không báo cáo lại điều này.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
cái bên dưới là từ một aterm
thiết bị đầu cuối.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
cat /etc/alternatives/x-terminal-emulator | grep exec
Đầu ra mẫu:
exec ('gnome-terminal', @ args);
Có câu trả lời cho hệ thống của tôi: gnome-terminal .
Vì vậy, gõ gnome-terminal
vào thiết bị đầu cuối của tôi bây giờ sẽ mở ra một cửa sổ thiết bị đầu cuối giống hệt nhau.
Câu trả lời đơn giản. Hoạt động cho cả console hoặc ssh.
Ví dụ cho thiết bị đầu cuối ký tự đơn giản:
ssh username@systemname
echo $TERM
dumb
cho bạn biết rằng bạn không thể mở các ứng dụng GUI trên kết nối đó
Ví dụ cho xterm (cũng hoạt động với PuTTY / Xming trên Windows)
ssh -Y username@systemname -- omit this if using PuTTY --
echo $TERM
xterm
có nghĩa là bạn có thể sử dụng các lệnh GUI như mở trình soạn thảo leafpad hoặc trình quản lý tệp nautilus.
Trên bàn điều khiển cũng vậy:
Open terminal window
echo $TERM
xterm
TERM
không phải là một biến xác định trình giả lập thiết bị đầu cuối mặc định, mà là một biến xác định các khả năng của hiện tại. Ví dụ: đặt biến thành "xterm-color" cho phép mọi chương trình đang chạy trong thiết bị đầu cuối biết rằng thiết bị đầu cuối hiện tại có nghĩa vụ phải hiểu màu sắc; đặt nó thành "linux" cho các chương trình biết rằng đây được coi là VT; vv