103.5 Bài 2
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
103 Lệnh GNU và Unix |
Mục tiêu: |
103.1 Tạo, giám sát và chấm dứt các Tiến trình |
Bài: |
2 trên 2 |
Giới thiệu
Các công cụ và tiện ích chúng ta đã thấy trong bài học trước rất hữu ích trong việc giám sát các tiến trình nói chung. Tuy nhiên, một quản trị viên hệ thống có thể sẽ cần nhiều hơn thế. Trong bài học này, chúng ta sẽ thảo luận về khái niệm bộ ghép kênh cửa sổ dòng lệnh cũng như về Màn hình GNU và tmux vì — dù các bộ giả lập cửa sổ dòng lệnh ngày nay đều rất hiện đại và hữu dụng — bộ ghép kênh vẫn bảo tồn một số tính năng mạnh mẽ và thú vị dành cho những quản trị viên hệ thống năng động.
Các tính năng của Bộ ghép kênh Cửa sổ Dòng lệnh
Trong các thiết bị điện tử, bộ ghép kênh (hoặc mux) là một thiết bị cho phép ta kết nối nhiều đầu vào với một đầu ra. Từ đó, bộ ghép kênh cửa sổ dòng lệnh sẽ cho phép chúng ta chuyển đổi giữa các đầu vào khác nhau theo yêu cầu. Mặc dù không hoàn toàn giống nhau, screen
và tmux
lại có cùng một loạt các tính năng chung:
-
Bất kỳ một lần gọi hàm thành công nào cũng sẽ dẫn đến ít nhất một phiên bao gồm ít nhất một cửa sổ. Các cửa sổ này sẽ chứa các chương trình.
-
Các cửa sổ có thể được chia thành các vùng hoặc ngăn — điều này có thể hỗ trợ năng suất khi làm việc đồng thời với nhiều chương trình khác nhau.
-
Kiểm soát dễ dàng: để chạy hầu hết các lệnh, chúng sử dụng tổ hợp phím — cái được gọi là tiền tố lệnh hoặc phím lệnh — theo sau là một ký tự khác.
-
Các phiên có thể được tách ra khỏi cửa sổ dòng lệnh của chúng (nghĩa là các chương trình sẽ được chuyển thành chạy ngầm và tiếp tục chạy). Điều này đảm bảo việc thực thi hoàn toàn các chương trình cho dù chúng ta vô tình đóng cửa sổ dòng lệnh, cửa sổ dòng lệnh đột nhiên bị đóng băng hoặc thậm chí là mất kết nối từ xa.
-
Kết nối với ổ.
-
Chế độ sao chép.
-
Chúng có khả năng tùy biến cao.
Màn hình GNU
Trong những ngày đầu của Unix (những năm 1970 - 80), máy tính về cơ bản là một đơn vị chứa các cửa sổ dòng lệnh được kết nối với một máy tính trung tâm chứ không có nhiều cửa sổ hoặc tab. Và đó là lý do đằng sau việc tạo ra Màn hình GNU vào năm 1987: nó mô phỏng nhiều màn hình VT100 độc lập trên một cửa sổ dòng lệnh vật lý duy nhất.
Cửa sổ
Màn hình GNU được gọi bằng cách gõ screen
vào cửa sổ dòng lệnh. Trước tiên, chúng ta sẽ thấy một thông báo chào mừng:
GNU Screen version 4.05.00 (GNU) 10-Dec-16 Copyright (c) 2010 Juergen Weigert, Sadrul Habib Chowdhury Copyright (c) 2008, 2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 Juergen Weigert, Michael Schroeder Copyright (c) 1987 Oliver Laumann (...)
Nhấn phím Dấu cách hoặc Enter để đóng thông báo và ta sẽ thấy dấu nhắc lệnh:
$
Có vẻ như không có gì xảy ra nhưng thực tế là screen
đã tạo và quản lý phiên và cửa sổ đầu tiên của nó. Tiền tố lệnh của màn hình là Ctrl+a. Để xem tất cả các cửa sổ ở cuối màn hình cửa sổ dòng lệnh, hãy nhập Ctrl+a-w:
0*$ bash
Đây chính là cửa sổ duy nhất của chúng ta cho đến thời điểm này! Tuy nhiên, hãy lưu ý rằng số đếm sẽ bắt đầu từ 0. Để tạo một cửa sổ khác, hãy nhập Ctrl+a-c và ta sẽ thấy một dấu nhắc lệnh mới. Hãy cùng bắt đầu ps
trong cửa sổ mới đó:
$ ps PID TTY TIME CMD 974 pts/2 00:00:00 bash 981 pts/2 00:00:00 ps
và gõ lại Ctrl+a-w:
0-$ bash 1*$ bash
Ở đây chúng ta có hai cửa sổ (lưu ý dấu hoa thị cho biết cửa sổ đang được hiển thị vào lúc này). Tuy nhiên, khi bắt đầu với Bash, cả hai đều sẽ được đặt tên giống nhau. Vì đã gọi ps
trong cửa sổ hiện tại nên hãy đổi tên nó thành cùng một tên đó. Để làm được điều này, ta phải nhập Ctrl+a-A và tên cửa sổ mới (ps
) khi được nhắc:
Set window's title to: ps
Bây giờ, hãy tạo một cửa sổ khác nhưng đặt tên cho nó ngay từ đầu là yetanotherwindow
. Điều này có thể được thực hiện bằng cách gọi screen
với khoá chuyển -t
:
$ screen -t yetanotherwindow
Ta có thể di chuyển giữa các cửa sổ bằng nhiều cách khác nhau:
-
Bằng cách sử dụng Ctrl+a-n (đi tới cửa sổ tiếp theo) và Ctrl+a-p (đi tới cửa sổ trước đó).
-
Bằng cách sử dụng Ctrl+a-number (đi tới cửa sổ số number).
-
Bằng cách sử dụng Ctrl+a-" để xem danh sách tất cả các cửa sổ. Ta có thể di chuyển lên và xuống bằng các phím mũi tên và chọn cửa sổ mình muốn bằng cách nhấn Enter:
Num Name Flags 0 bash $ 1 ps $ 2 yetanotherwindow
Khi làm việc với các cửa sổ, điều quan trọng cần nhớ là:
-
Cửa sổ sẽ chạy các chương trình của chúng một cách hoàn toàn độc lập.
-
Các chương trình sẽ tiếp tục chạy ngay cả khi cửa sổ của chúng không được hiển thị (và cả khi phiên màn hình được tách ra như chúng ta sẽ thấy ngay sau đây).
Để xóa một cửa sổ, ta chỉ cần chấm dứt chương trình đang chạy trong đó (khi cửa sổ cuối cùng bị xóa, screen
sẽ tự chấm dứt). Ngoài ra, hãy sử dụng Ctrl+a-k trong cửa sổ cần muốn xóa; chúng ta sẽ được yêu cầu xác nhận:
Really kill this window [y/n] Window 0 (bash) killed.
Vùng
screen
có thể chia màn hình cửa sổ dòng lệnh thành nhiều vùng để chứa các cửa sổ. Các phần chia này có thể nằm ngang (Ctrl+a-S) hoặc dọc (Ctrl+a-|).
Điều duy nhất mà vùng mới hiển thị sẽ chỉ là --
ở dưới cùng mang ý nghĩa là nó đang trống:
1 ps --
Để chuyển sang vùng mới, hãy nhập Ctrl+a-Tab. Bây giờ, ta có thể thêm một cửa sổ bằng bất kỳ phương pháp nào mà chúng ta đã biết (ví dụ như Ctrl+a-2). Bây giờ, --
sẽ biến thành 2 yetanotherwindow
:
$ ps $ PID TTY TIME CMD 1020 pts/2 00:00:00 bash 1033 pts/2 00:00:00 ps $ screen -t yetanotherwindow 1 ps 2 yetanotherwindow
Các khía cạnh quan trọng cần ghi nhớ khi làm việc với các vùng là:
-
Di chuyển giữa các vùng bằng cách gõ Ctrl+a-Tab.
-
Có thể chấm dứt tất cả các vùng ngoại trừ vùng hiện tại bằng Ctrl+a-Q.
-
Có thể chấm dứt vùng hiện tại bằng Ctrl+a-X.
-
Chấm dứt một vùng sẽ không chấm dứt cửa sổ của nó.
Phiên
Cho đến nay, chúng ta đã làm quen với một vài cửa sổ và vùng, nhưng tất cả trong số chúng đều thuộc về cùng một phiên duy nhất. Đã đến lúc bắt đầu làm quen với các phiên. Để xem danh sách tất cả các phiên, hãy nhập screen -list
hoặc screen -ls
:
$ screen -list There is a screen on: 1037.pts-0.debian (08/24/19 13:53:35) (Attached) 1 Socket in /run/screen/S-carol.
Đó là phiên duy nhất của chúng ta cho đến nay:
- PID
-
1037
- Tên
-
pts-0.debian
(biểu thị cửa sổ dòng lệnh — trong trường hợp của chúng ta là pseudo terminal slave — và tên máy chủ). - Trạng thái
-
Đính kèm (
Attached
).
Hãy cùng tạo một phiên mới và đặt cho nó một cái tên mô tả rõ ràng hơn:
$ screen -S "second session"
Màn hình cửa sổ dòng lệnh sẽ bị xóa và ta sẽ nhận được một dấu nhắc mới. Chúng taa có thể kiểm tra các phiên một lần nữa:
$ screen -ls There are screens on: 1090.second session (08/24/19 14:38:35) (Attached) 1037.pts-0.debian (08/24/19 13:53:36) (Attached) 2 Sockets in /run/screen/S-carol.
Để kết thúc một phiên, hãy thoát khỏi tất cả các cửa sổ của nó hoặc chỉ cần gõ lệnh screen -S SESSION-PID -X quit
(ta cũng có thể cung cấp tên phiên thay thế). Hãy cùng thoát khỏi phiên đầu tiên:
$ screen -S 1037 -X quit
Ta sẽ được đưa trở lại dấu nhắc trong cửa sổ dòng lệnh bên ngoài screen
. Nhưng hãy nhớ rằng, phiên thứ hai của chúng ta vẫn còn tồn tại:
$ screen -ls There is a screen on: 1090.second session (08/24/19 14:38:35) (Detached) 1 Socket in /run/screen/S-carol.
Tuy nhiên, vì đã hủy phiên mẹ nên nó đã được cấp một nhãn mới là Detached
(Rời).
Tách Phiên
Vì một số lý do, ta có thể sẽ muốn tách phiên màn hình khỏi cửa sổ dòng lệnh của nó:
-
Để máy tính tại nơi làm việc thực hiện công việc của nó và sau này kết nối từ xa tại nhà.
-
Chia sẻ một phiên với những người dùng khác.
Ta có thể tách một phiên bằng tổ hợp phím Ctrl+a-d. Ta sẽ được đưa trở lại cửa sổ dòng lệnh của mình:
[detached from 1090.second session] $
Để đính lại phiên, ta sẽ sử dụng lệnh screen -r SESSION-PID
. Ngoài ra, ta có thể sử dụng SESSION-NAME
như đã thấy ở trên. Nếu chỉ có một phiên tách rời, cả hai đều không phải là bắt buộc:
$ screen -r
Lệnh này đủ để đính vào lại phiên thứ hai:
$ screen -ls There is a screen on: 1090.second session (08/24/19 14:38:35) (Attached) 1 Socket in /run/screen/S-carol.
Các tùy chọn quan trọng để đính lại phiên:
-d -r
-
Đính lại một phiên và — nếu cần — tách nó ra trước.
-d -R
-
Tương tự như
-d -r
nhưngscreen
thậm chí sẽ tạo phiên đầu tiên nếu nó không tồn tại. -d -RR
-
Tương tự như
-d -R
. Tuy nhiên, tuỳ chọn này sẽ sử dụng phiên đầu tiên nếu có nhiều phiên. -D -r
-
Đính lại một phiên. Nếu cần, hãy tách và đăng xuất từ xa trước.
-D -R
-
Nếu một phiên đang chạy, hãy đính lại (tách và đăng xuất từ xa trước nếu cần). Nếu nó không chạy, hãy tạo nó và thông báo cho người dùng.
-D -RR
-
Tương tự như
-D -R
— nhưng mạnh hơn. -d -m
-
Bắt đầu
screen
ở chế độ tách. Tuỳ chọn này sẽ tạo ra một phiên mới nhưng không đính kèm với nó. Tuỳ chọn này hữu ích đối với các tệp lệnh khởi động hệ thống. -D -m
-
Tương tự như
-d -m
nhưng không rẽ nhánh một tiến trình mới. Lệnh sẽ thoát nếu phiên kết thúc.
Hãy đọc trang hướng dẫn dành cho screen
để tìm hiểu về các tùy chọn khác.
Sao chép & Dán: Chế độ cuộn lại
Màn hình GNU có chế độ sao chép hoặc cuộn lại. Sau khi vào, ta có thể di chuyển con trỏ trong cửa sổ hiện tại và đi qua nội dung lịch sử của nó bằng các phím mũi tên. Ta có thể đánh dấu văn bản và sao chép nó qua các cửa sổ. Các bước để làm theo là:
-
Vào chế độ sao chép/cuộn lại: Ctrl+a-[.
-
Di chuyển đến đầu đoạn văn bản cần sao chép bằng các phím mũi tên.
-
Đánh dấu phần đầu của đoạn văn bản cần sao chép: Dấu cách.
-
Di chuyển đến cuối đoạn văn bản cần sao chép bằng các phím mũi tên.
-
Đánh dấu phần cuối của đoạn văn bản cần sao chép: Dấu cách.
-
Chuyển đến cửa sổ muốn chọn và dán đoạn văn bản: Ctrl+a-].
Tùy chỉnh Màn hình
Tệp cấu hình toàn hệ thống cho màn hình là /etc/screenrc
. Ngoài ra, ta có thể sử dụng một lệnh ~/.screenrc
cấp người dùng. Tệp bao gồm bốn phần cấu hình chính:
SCREEN SETTINGS
-
Ta có thể xác định cài đặt chung bằng cách chỉ định chỉ thị, theo sau là khoảng trắng và giá trị (như trong
defscrollback 1024
). SCREEN KEYBINDINGS
-
Phần này khá thú vị vì nó cho phép ta xác định lại các tổ hợp phím có thể can thiệp vào việc sử dụng cửa sổ dòng lệnh thường xuyên. Sử dụng từ khóa
bind
, theo sau là một khoảng trắng, ký tự sẽ sử dụng sau tiền tố lệnh, một khoảng trắng khác và lệnh sẽ làbind l kill
(cài đặt này sẽ thay đổi cách tắt cửa sổ mặc định thành Ctrl+a-l).Để hiển thị tất cả các liên kết của màn hình, hãy nhập Ctrl+a-? hoặc tham khảo trang hướng dẫn.
TipTất nhiên, bạn cũng có thể thay đổi tiền tố lệnh. Ví dụ: để chuyển từ Ctrl+a sang Ctrl+b, bạn chỉ cần thêm dòng này:
escape ^Bb
. TERMINAL SETTINGS
-
Phần này bao gồm các cài đặt liên quan đến kích thước cửa sổ của cửa sổ dòng lệnh và bộ nhớ đệm bên cạnh các cài đặt khác. Ví dụ: để bật chế độ không chặn nhằm đối phó tốt hơn với các kết nối ssh không ổn định, cấu hình được sử dụng sẽ là
defnonblock 5
. STARTUP SCREENS
-
Ta có thể bao gồm cả các lệnh để chạy các chương trình khác nhau khi khởi động
screen
, ví dụ nhưscreen -t top top
(màn hình sẽ mở một cửa sổ có têntop
vớitop
ở bên trong).
tmux
tmux
được phát hành vào năm 2007. Mặc dù rất giống với screen
nhưng nó lại có một vài điểm khác biệt đáng chú ý:
-
Mô hình máy khách-máy chủ: máy chủ cung cấp một số phiên, mỗi phiên có thể có một số cửa sổ được liên kết với nó và từ đó có thể được chia sẻ bởi nhiều máy khách khác nhau.
-
Chọn lọc tương tác các phiên, cửa sổ và ứng dụng khách thông qua các menu.
-
Cùng một cửa sổ có thể được liên kết với nhiều phiên.
-
Có sẵn cả hai bố cục phím vim và Emacs.
-
Hỗ trợ thiết bị cửa sổ dòng lệnh UTF-8 và 256 màu.
Cửa sổ
tmux
có thể được gọi chỉ bằng cách gõ tmux
tại dấu nhắc lệnh. Ta sẽ thấy một dấu nhắc vỏ và một thanh trạng thái ở cuối cửa sổ:
[0] 0:bash* "debian" 18:53 27-Aug-19
Ngoài hostname
(tên máy chủ), thời gian và ngày tháng, thanh trạng thái còn cung cấp các thông tin sau:
- Tên Phiên
-
[0]
- Số lượng Cửa sổ
-
0:
- Tên cửa sổ
-
bash*
. Theo mặc định, đây là tên của chương trình đang chạy bên trong cửa sổ và — không giống nhưscreen
—tmux
sẽ tự động cập nhật nó để thể hiện chương trình đang chạy hiện tại. Hãy lưu ý dấu hoa thị cho ta biết đây là cửa sổ hiện tại và có thể nhìn thấy.
Ta có thể gán tên phiên và tên cửa sổ khi gọi tmux
:
$ tmux new -s "LPI" -n "Window zero"
Thanh trạng thái sẽ thay đổi tương ứng:
[LPI] 0:Window zero* "debian" 19:01 27-Aug-19
Tiền tố lệnh của tmux là Ctrl+b. Để tạo một cửa sổ mới, ta chỉ cần gõ Ctrl+b-c. Ta sẽ được đưa đến một dấu nhắc mới và thanh trạng thái sẽ thể hiện cửa sổ mới:
[LPI] 0:Window zero- 1:bash* "debian" 19:02 27-Aug-19
Vì Bash là vỏ nền tảng nên cửa sổ mới sẽ được đặt tên đó theo mặc định. Hãy bắt đầu lệnh top
và xem tên cửa sổ được thay đổi thành top
:
[LPI] 0:Window zero- 1:top* "debian" 19:03 27-Aug-19
Trong mọi trường hợp, ta đều có thể đổi tên cửa sổ bằng Ctrl+b-,. Khi được nhắc, hãy cung cấp tên mới và nhấn Enter:
(rename-window) Window one
Ta có thể hiển thị tất cả các cửa sổ để lựa chọn với Ctrl+b-w (sử dụng các phím mũi tên để di chuyển lên xuống và enter để chọn):
(0) 0: Window zero- "debian" (1) 1: Window one* "debian"
Theo cách tương tự với screen
, chúng ta có thể chuyển từ cửa sổ này sang cửa sổ khác bằng:
- Ctrl+b-n
-
đi tới cửa sổ tiếp theo.
- Ctrl+b-p
-
đi tới cửa sổ trước đó.
- Ctrl+b-number
-
đi tới cửa sổ số number.
Để thoát khỏi cửa sổ, hãy sử dụng Ctrl+b-&. Ta sẽ được yêu cầu xác nhận:
kill-window Window one? (y/n)
Các lệnh cửa sổ thú vị khác gồm có:
- Ctrl+b-f
-
tìm cửa sổ theo tên.
- Ctrl+b-.
-
thay đổi số chỉ mục cửa sổ.
Để đọc toàn bộ danh sách các lệnh, hãy tham khảo trang hướng dẫn.
Ngăn
Tiện ích chia cửa sổ của screen
cũng có trong tmux
. Tuy nhiên, kết quả của việc phân chia lại không được gọi là vùng mà là ngăn. Khác với vùng, ngăn là các cửa sổ dòng lệnh giả hoàn chỉnh được liên kết với một cửa sổ. Điều này có nghĩa là việc tắt một ngăn cũng sẽ tắt cả cửa sổ dòng lệnh giả của nó và bất kỳ chương trình liên quan nào đang chạy bên trong.
Để chia một cửa sổ theo chiều ngang, chúng ta sử dụng Ctrl+b-":
Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 4050960 total, 3730920 free, 114880 used, 205160 buff/cache KiB Swap: 4192252 total, 4192252 free, 0 used. 3716004 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1340 carol 20 0 44876 3400 2800 R 0.3 0.1 0:00.24 top 1 root 20 0 139088 6988 5264 S 0.0 0.2 0:00.50 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 kworker/0:0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 0:00.06 rcu_sched 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 $ ─────────────────────────────────────────────────────────────────────────────────────────────── $ [LPI] 0:Window zero- 1:Window one* "debian" 19:05 27-Aug-19
Để chia theo chiều dọc, hãy sử dụng Ctrl+b-%:
│$ 1 root 20 0 139088 6988 5264 S 0.0 0.2 0:00.50 systemd │ │ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd │ │ 3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0 │ 4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 kworker/0:0 │ 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H│ 7 root 20 0 0 0 0 S 0.0 0.0 0:00.06 rcu_sched │ 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh │ 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 │ │ 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drai│ n │ 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 │ │ 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 │ │ $ │ ───────────────────────────────────────────────────────────────────────────────┴─────────────── $ [LPI] 0:Window zero- 1:Window one* "debian" 19:05 27-Aug-19
Để hủy ngăn hiện tại (cùng với cửa sổ dòng lệnh giả đang chạy bên trong ngăn đó và bất kỳ chương trình liên quan nào), hãy sử dụng Ctrl+b-x. Ta sẽ được yêu cầu xác nhận trên thanh trạng thái:
kill-pane 1? (y/n)
Các lệnh Ngăn quan trọng:
- Ctrl+b-↑,↓,←,→
-
di chuyển giữa các ngăn.
- Ctrl+b-;
-
di chuyển đến ngăn hoạt động cuối cùng.
- Ctrl+b-Ctrl+arrow key
-
thay đổi kích thước ngăn bằng một dòng.
- Ctrl+b-Altl+arrow key
-
thay đổi kích thước ngăn bằng năm dòng.
- Ctrl+b-{
-
hoán đổi ngăn (ngăn hiện tại sang ngăn trước đó).
- Ctrl+b-}
-
hoán đổi ngăn (ngăn hiện tại sang ngăn tiếp theo).
- Ctrl+b-z
-
phóng to/thu nhỏ ngăn.
- Ctrl+b-t
-
tmux
hiển thị một chiếc đồng hồ bên trong ngăn (tắt nó bằng cách nhấnq
). - Ctrl+b-!
-
biến ngăn thành cửa sổ.
Để đọc toàn bộ danh sách các lệnh, hãy tham khảo trang hướng dẫn.
Phiên
Để liệt kê các phiên trong tmux
, ta có thể sử dụng Ctrl+b-s:
(0) + LPI: 2 windows (attached)
Ngoài ra, ta có thể sử dụng lệnh tmux ls
:
$ tmux ls LPI: 2 windows (created Tue Aug 27 19:01:49 2019) [158x39] (attached)
Chỉ có một phiên (LPI
) là có bao gồm hai cửa sổ. Hãy cùng tạo một phiên mới từ trong phiên hiện tại của chúng ta. Điều này có thể đạt được bằng cách sử dụng Ctrl+b, nhập :new
tại dấu nhắc, sau đó nhấn Enter. Ta sẽ được chuyển đến phiên làm việc mới như có thể quan sát thấy được trên thanh trạng thái:
[2] 0:bash* "debian" 19:15 27-Aug-19
Theo mặc định, tmux
sẽ đặt tên phiên là 2
. Để đổi tên nó, hãy sử dụng Ctrl+b-$. Khi được nhắc, hãy cung cấp tên mới và nhấn Enter:
(rename-session) Second Session
Ta có thể chuyển phiên bằng Ctrl+b-s (sử dụng các phím mũi tên và enter):
(0) + LPI: 2 windows (1) + Second Session: 1 windows (attached)
Để hủy phiên, ta có thể sử dụng lệnh tmux kill-session -t SESSION-NAME
. Nếu nhập lệnh từ bên trong phiên đính kèm hiện tại, ta sẽ được đưa ra khỏi tmux
và quay lại phiên cửa sổ dòng lệnh ban đầu:
$ tmux kill-session -t "Second Session" [exited] $
Tách Phiên
Bằng cách chấm dứt Second Session
, chúng ta đã bị thoát ra ngoài tmux
. Tuy nhiên, chúng ta vẫn có một phiên đang hoạt động. Hãy hỏi tmux
để biết danh sách các phiên và chắc chắn chúng ta sẽ tìm thấy nó ở đó:
$ tmux ls LPI: 2 windows (created Tue Aug 27 19:01:49 2019) [158x39]
Tuy nhiên, phiên này đã được tách ra khỏi cửa sổ dòng lệnh của nó. Chúng ta có thể đính nó vào bằng tmux attachment -t SESSION-NAME
(attach
có thể được thay thế bằng at
hoặc — đơn giản — a
). Khi chỉ có một phiên duy nhất, đặc tả tên là tùy chọn:
$ tmux a
Bây giờ, ta đã trở lại phiên làm việc của mình; để tách khỏi nó, hãy nhấn Ctrl+b-d:
[detached (from session LPI)] $
Tip
|
Cùng một phiên có thể được đính vào nhiều cửa sổ dòng lệnh. Nếu muốn đính vào một phiên để đảm bảo rằng phiên đầu tiên sẽ được tách ra khỏi bất kỳ một cửa sổ dòng lệnh nào khác, hãy sử dụng khóa chuyển |
Các lệnh quan trọng để đính/tách phiên:
- Ctrl+b-D
-
chọn máy khách cần tách.
- Ctrl+b-r
-
làm mới cửa sổ dòng lệnh của máy khách.
Để đọc toàn bộ danh sách các lệnh, hãy tham khảo trang hướng dẫn.
Sao chép & Dán: Chế độ cuộn lại
tmux
cũng có chế độ sao chép về cơ bản là giống như screen
(hãy nhớ sử dụng tiền tố lệnh của tmux chứ không phải của screen
). Sự khác biệt duy nhất về mặt lệnh là ta sẽ sử dụng Ctrl + Dấu cách để đánh dấu phần đầu của vùng chọn và Alt+w để sao chép văn bản đã chọn.
Tùy chỉnh tmux
Các tệp cấu hình cho tmux
thường nằm ở /etc/tmux.conf
và ~/.tmux.conf
. Khi bắt đầu, tmux
sẽ cung cấp các tệp này nếu chúng tồn tại. Ngoài ra còn có một khả năng khác là bắt đầu tmux
với khóa chuyển -f
để cung cấp tệp cấu hình thay thế. Ta có thể tìm thấy ví dụ về tệp cấu hình tmux
tại /usr/share/doc/tmux/example_tmux.conf
. Mức độ tùy chỉnh mà ta có thể đạt được thực sự rất cao. Một số điều chúng ta có thể làm bao gồm:
-
Thay đổi khóa tiền tố
# Change the prefix key to C-a set -g prefix C-a unbind C-b bind C-a send-prefix
-
Đặt thêm tổ hợp phím cho cửa sổ cao hơn 9
# Some extra key bindings to select higher numbered windows bind F1 selectw -t:10 bind F2 selectw -t:11 bind F3 selectw -t:12
Để có danh sách đầy đủ tất cả các liên kết, hãy nhập Ctrl+b-? (nhấn q
để thoát) hoặc tham khảo trang hướng dẫn.
Bài tập Hướng dẫn
Hãy cho biết các câu lệnh/tính năng nào sau đây tương ứng với GNU Screen, tmux hoặc cả hai:
+
Tính năng/Câu lệnh | Màn hình GNU | tmux |
---|---|---|
Tiền tố lệnh mặc định là Ctrl+a |
||
Mô hình Máy Khách-Máy Chủ |
||
Ngăn là cửa sổ dòng lệnh giả |
||
Chấm dứt một vùng mà không chấm dứt các cửa sổ liên quan |
||
Phiên bao gồm các cửa sổ |
||
Phiên có thể được tách ra |
-
Hãy cài đặt GNU Screen trên máy tính của bạn (tên gói:
screen
) và hoàn thành các tác vụ sau:-
Khởi động chương trình. Bạn sẽ sử dụng lệnh gì?
-
Bắt đầu
top
. -
Sử dụng tiền tố khóa của screen và mở một cửa sổ mới; sau đó, mở
/etc/screenrc
bằngvi
. -
Liệt kê các cửa sổ ở cuối màn hình.
-
Đổi tên của cửa sổ hiện tại thành
vi
. -
Đổi tên cửa sổ còn lại thành
top
. Để làm điều đó, trước tiên hãy hiển thị danh sách tất cả các cửa sổ để bạn có thể di chuyển lên xuống và chọn cửa sổ phù hợp. -
Kiểm tra xem tên cửa sổ đã được thay đổi chưa bằng cách hiển thị lại tên cửa sổ ở cuối màn hình.
-
Bây giờ, hãy tách phiên ra và để
screen
tạo một phiên mới có tênssh
. -
Cũng tách khỏi
ssh
và đểscreen
hiển thị danh sách các phiên. -
Bây giờ, hãy đính vào phiên đầu tiên bằng cách sử dụng PID của nó.
-
Bạn nên quay lại cửa sổ hiển thị
top
. Chia cửa sổ theo chiều ngang và di chuyển đến vùng trống mới. -
Để
screen
liệt kê tất cả các cửa sổ và chọnvi
để hiển thị trong vùng trống mới. -
Bây giờ, hãy chia vùng hiện tại theo chiều dọc, di chuyển vào vùng trống mới được tạo và liên kết nó với một cửa sổ hoàn toàn mới.
-
Chấm dứt tất cả các vùng ngoại trừ vùng hiện tại (hãy nhớ rằng, mặc dù đã chấm dứt các vùng nhưng các cửa sổ vẫn còn hoạt động). Sau đó, thoát khỏi tất cả các cửa sổ của phiên hiện tại cho đến khi phiên đó kết thúc.
-
Cuối cùng, yêu cầu
screen
liệt kê các phiên của nó một lần nữa, chấm dứt phiênssh
còn lại bằng PID và kiểm tra xem có thực sự là không còn phiên nào nữa hay không.
-
-
Hãy cài đặt
tmux
trên máy tính của bạn (tên gói:tmux
) và hoàn thành các tác vụ sau:-
Khởi động chương trình. Bạn sẽ sử dụng lệnh gì?
-
Bắt đầu
top
(hãy lưu ý — trong vài giây — tên của cửa sổ thay đổi thànhtop
trong thanh trạng thái): -
Sử dụng tiền tố chính của tmux, mở một cửa sổ mới; sau đó, tạo
~/.tmux.conf
bằng cách sử dụngnano
: -
Chia đôi cửa sổ theo chiều dọc và giảm kích thước của ngăn vừa tạo một vài lần:
-
Đổi tên của cửa sổ hiện tại thành
text editing
; sau đó, yêu cầutmux
hiển thị danh sách tất cả các phiên của nó: -
Di chuyển đến cửa sổ đang chạy
top
và quay lại cửa sổ hiện tại bằng cùng một tổ hợp phím: -
Tách khỏi phiên hiện tại và tạo một phiên mới có tên là
ssh
và tên cửa sổ của nó làssh window
: -
Cũng tách khỏi phiên
ssh
và đểtmux
hiển thị lại danh sách các phiên:Note================================================================= ================================================== Từ thời điểm này trở đi, bài tập sẽ yêu cầu bạn sử dụng máy từ xa để kết nối ssh
với máy chủ lưu trữ cục bộ của bạn (máy ảo hoàn toàn hợp lệ và có thể sẽ rất hữu ích). Hãy đảm bảo rằng bạn đã cài đặt và chạyopenssh-server
trên máy cục bộ của mình và ít nhất làopenssh-client
đã được cài đặt trên máy từ xa. ================================================================= ================================================== -
Bây giờ, hãy khởi động một máy từ xa và kết nối qua
ssh
với máy chủ cục bộ của bạn. Khi kết nối đã được thiết lập, hãy kiểm tra các phiêntmux
: -
Trên máy chủ từ xa, hãy đính phiên
ssh
theo tên: -
Quay lại máy cục bộ của bạn, hãy đính vào phiên
ssh
theo tên để đảm bảo kết nối với máy chủ từ xa sẽ bị ngắt trước: -
Hiển thị tất cả các phiên để lựa chọn và chuyển đến phiên đầu tiên của bạn (
[0]
). Sau đó, hãy chấm dứt phiênssh
theo tên: -
Cuối cùng, tách khỏi phiên hiện tại và chấm dứt nó theo tên:
-
Bài tập Mở rộng
-
Cả
screen
vàtmux
đều có thể vào chế độ dòng lệnh thông qua tiền tố lệnh + : (chúng ta đã thấy một ví dụ ngắn gọn vớitmux
). Hãy tìm hiểu và thực hiện các tác vụ sau trong chế độ dòng lệnh:-
Đưa
screen
vào chế độ sao chép: -
Buộc
tmux
đổi tên cửa sổ hiện tại: -
Buộc
screen
đóng tất cả các cửa sổ và kết thúc phiên: -
Buộc
tmux
chia một khung thành hai: -
Buộc
tmux
chấm dứt cửa sổ hiện tại:
-
-
Khi vào chế độ sao chép trong
screen
, không chỉ có các phím mũi tên và phím PgUP hoặc PgDown để điều hướng cửa sổ hiện tại và bộ đệm cuộn ngược mà còn có trình chỉnh sửa toàn màn hình giống vi. Bằng cách sử dụng trình chỉnh sửa này, hãy thực hiện các tác vụ sau:-
Echo
supercalifragilisticexpialidocious
trong cửa sổ dòng lệnhscreen
: -
Sao chép năm ký tự liên tiếp (từ trái sang phải) ở dòng ngay phía trên của con trỏ:
-
Cuối cùng, dán lại vùng đã chọn (
stice
) vào dấu nhắc lệnh:
-
-
Giả sử bạn muốn chia sẻ phiên
tmux
(our_session
) với người dùng khác. Bạn đã tạo ổ nối (/tmp/our_socket
) với các quyền phù hợp để cả bạn và người dùng khác đều có thể đọc và ghi được. Cần đáp ứng hai điều kiện nào khác để người dùng thứ hai có thể đính thành công phiên thông quatmux -S /tmp/our_socket a -t our_session
?
Tóm tắt
Trong bài học này, chúng ta đã học về bộ ghép kênh cửa sổ dòng lệnh nói chung và GNU Screen và tmux nói riêng. Các khái niệm quan trọng cần nhớ bao gồm:
-
Tiền tố lệnh:
screen
sử dụng Ctrl+a + ký tự;tmux
, Ctrl+b + _ký tự. -
Cấu trúc của phiên, cửa sổ và phân chia cửa sổ (vùng hoặc ngăn).
-
Chế độ sao chép.
-
Tách phiên: một trong những tính năng mạnh nhất của bộ ghép kênh.
Các lệnh được dùng trong bài học này:
screen
-
Bắt đầu một phiên
screen
. tmux
-
Bắt đầu một phiên
tmux
.
Đáp án Bài tập Hướng dẫn
Hãy cho biết các câu lệnh/tính năng nào sau đây tương ứng với GNU Screen, tmux hoặc cả hai:
+
Tính năng/Câu lệnh | Màn hình GNU | tmux |
---|---|---|
Tiền tố lệnh mặc định là Ctrl+a |
x |
|
Mô hình Máy Khách-Máy Chủ |
x |
|
Ngăn là cửa sổ dòng lệnh giả |
x |
|
Chấm dứt một vùng mà không chấm dứt (các) cửa sổ liên quan |
x |
|
Phiên bao gồm các cửa sổ |
x |
x |
Phiên có thể được tách ra |
x |
x |
-
Hãy cài đặt GNU Screen trên máy tính của bạn (tên gói:
screen
) và hoàn thành các tác vụ sau:-
Khởi động chương trình. Bạn sẽ sử dụng lệnh gì?
screen
-
Bắt đầu
top
.top
-
Sử dụng tiền tố khóa của screen và mở một cửa sổ mới; sau đó, mở
/etc/screenrc
bằngvi
.Ctrl+a-c
sudo vi /etc/screenrc
-
Liệt kê các cửa sổ ở cuối màn hình.
Ctrl+a-w
-
Đổi tên của cửa sổ hiện tại thành
vi
.Ctrl+a-A. Sau đó, chúng ta phải gõ
vi
và nhấn enter. -
Đổi tên cửa sổ còn lại thành
top
. Để làm điều đó, trước tiên hãy hiển thị danh sách tất cả các cửa sổ để bạn có thể di chuyển lên xuống và chọn cửa sổ phù hợp.Trước tiên, hãy nhập Ctrl+a-". Sau đó, sử dụng các phím mũi tên để đánh dấu cửa sổ có nội dung
0 bash
và nhấn enter. Cuối cùng, nhập Ctrl+a-A, nhậptop
và nhấn enter. -
Kiểm tra xem tên cửa sổ đã được thay đổi chưa bằng cách hiển thị lại tên cửa sổ ở cuối màn hình.
Ctrl+a-w
-
Bây giờ, hãy tách phiên ra và để
screen
tạo một phiên mới có tênssh
.Ctrl+a-d
screen -S "ssh"
và nhấn enter. -
Cũng tách khỏi
ssh
và đểscreen
hiển thị danh sách các phiên.Ctrl+a-d
screen -list
hoặcscreen -ls
. -
Bây giờ, hãy đính vào phiên đầu tiên bằng cách sử dụng PID của nó.
screen -r PID-OF-SESSION
-
Bạn nên quay lại cửa sổ hiển thị
top
. Chia cửa sổ theo chiều ngang và di chuyển đến vùng trống mới.Ctrl+a-S
Ctrl+a-Tab
-
Để
screen
liệt kê tất cả các cửa sổ và chọnvi
để hiển thị trong vùng trống mới.Sử dụng Ctrl+a-" để hiển thị tất cả các cửa sổ để lựa chọn, đánh dấu
vi
và nhấn enter. -
Bây giờ, hãy chia vùng hiện tại theo chiều dọc, di chuyển vào vùng trống mới được tạo và liên kết nó với một cửa sổ hoàn toàn mới.
Ctrl+a-|
Ctrl+a-Tab
Ctrl+a-c
-
Chấm dứt tất cả các vùng ngoại trừ vùng hiện tại (hãy nhớ rằng, mặc dù đã chấm dứt các vùng nhưng các cửa sổ vẫn còn hoạt động). Sau đó, thoát khỏi tất cả các cửa sổ của phiên hiện tại cho đến khi phiên đó kết thúc.
Ctrl+a-Q.
exit
(để thoát khỏi Bash). Shift+:, sau đó, gõquit
và nhấn enter (để thoátvi
). Sau đó, hãy gõexit
(để thoát khỏi vỏ Bash bên dưới)q
(để kết thúctop
); sau đó, hãy gõexit
(để thoát khỏi vỏ Bash bên dưới). -
Cuối cùng, yêu cầu
screen
liệt kê các phiên của nó một lần nữa, chấm dứt phiênssh
còn lại bằng PID và kiểm tra xem có thực sự là không còn phiên nào nữa hay không.screen -list
orscreen -ls
screen -S PID-OF-SESSION -X quit
screen -list
orscreen -ls
-
-
Hãy cài đặt
tmux
trên máy tính của bạn (tên gói:tmux
) và hoàn thành các tác vụ sau:-
Khởi động chương trình. Bạn sẽ sử dụng lệnh gì?
+
tmux
-
Bắt đầu
top
(hãy lưu ý — trong vài giây — tên của cửa sổ thay đổi thànhtop
trong thanh trạng thái):top
-
Sử dụng tiền tố chính của tmux, mở một cửa sổ mới; sau đó, tạo
~/.tmux.conf
bằng cách sử dụngnano
:Ctrl+b-c
nano ~/.tmux.conf
-
Chia đôi cửa sổ theo chiều dọc và giảm kích thước của ngăn vừa tạo một vài lần:
Ctrl+b-"
Ctrl+b-Ctrl+↓
-
Đổi tên của cửa sổ hiện tại thành
text editing
; sau đó, yêu cầutmux
hiển thị một danh sách với tất cả các phiên của nó:Ctrl+b-,. Sau đó, chúng ta sẽ cung cấp tên mới và nhấn enter. Ctrl+b-s hoặc
tmux ls
. -
Di chuyển đến cửa sổ đang chạy
top
và quay lại cửa sổ hiện tại bằng cùng một tổ hợp phím:Ctrl+b-n hoặc Ctrl+b-p
-
Tách khỏi phiên hiện tại và tạo một phiên mới có tên là
ssh
với tên cửa sổ làssh window
:Ctrl+b-d
tmux new -s "ssh" -n "ssh window"
-
Cũng tách khỏi phiên
ssh
và đểtmux
hiển thị lại danh sách các phiên:Ctrl+b-d
tmux ls
Note================================================================= ================================================== Từ thời điểm này trở đi, bài tập sẽ yêu cầu bạn sử dụng máy từ xa để kết nối ssh
với máy chủ lưu trữ cục bộ của bạn (máy ảo hoàn toàn hợp lệ và có thể sẽ rất hữu ích). Hãy đảm bảo rằng bạn đã cài đặt và chạyopenssh-server
trên máy cục bộ của mình và ít nhất làopenssh-client
đã được cài đặt trên máy từ xa. ================================================================= ================================================== -
Bây giờ, hãy khởi động một máy từ xa và kết nối qua
ssh
với máy chủ cục bộ của bạn. Khi kết nối đã được thiết lập, hãy kiểm tra các phiêntmux
:Trên máy chủ từ xa:
ssh local-username@local-ipaddress
. Sau khi kết nối với máy cục bộ:tmux ls
. -
Trên máy chủ từ xa, hãy đính phiên
ssh
theo tên:tmux a -t ssh
(a
có thể được thay thế bằngat
hoặcattach
). -
Quay lại máy cục bộ của bạn, hãy đính vào phiên
ssh
theo tên để đảm bảo kết nối với máy chủ từ xa sẽ bị ngắt trước:tmux a -d -t ssh
(a
có thể được thay thế bằngat
hoặcattach
). -
Hiển thị tất cả các phiên để lựa chọn và chuyển đến phiên đầu tiên của bạn (
[0]
). Sau đó, hủy phiênssh
theo tên:Nhập Ctrl+b-s, sử dụng các phím mũi tên để đánh dấu phiên
0
và nhấn entertmux kill-session -t ssh
. -
Cuối cùng, tách khỏi phiên hiện tại và chấm dứt nó theo tên:
Ctrl+b-d
tmux kill-session -t 0
.
-
Đáp án Bài tập Mở rộng
-
Cả
screen
vàtmux
đều có thể vào chế độ dòng lệnh thông qua tiền tố lệnh + : (chúng ta đã thấy một ví dụ ngắn gọn vớitmux
). Hãy tìm hiểu và thực hiện các tác vụ sau trong chế độ dòng lệnh:-
Đưa
screen
vào chế độ sao chép:Ctrl+a-: — sau đó gõ
copy
. -
Buộc
tmux
đổi tên cửa sổ hiện tại:Ctrl+b-: — sau đó gõ
rename-window
. -
Buộc
screen
đóng tất cả các cửa sổ và kết thúc phiên:Ctrl+a-: — sau đó gõ
quit
. -
Buộc
tmux
chia một khung thành hai:Ctrl+b-: — sau đó gõ
split-window
. -
Buộc
tmux
chấm dứt cửa sổ hiện tại:Ctrl+b-: — sau đó gõ
kill-window
.
-
-
Khi vào chế độ sao chép trong
screen
, bạn không chỉ có thể sử dụng các phím mũi tên và PgUP hoặc PgDown để điều hướng cửa sổ hiện tại và bộ đệm cuộn lùi mà còn có khả năng sử dụng một trình chỉnh sửa toàn màn hình giống như vi. Bằng cách sử dụng trình chỉnh sửa này, hãy thực hiện các tác vụ sau:-
Báo lại
supercalifragilisticexpialidocious
trong cửa sổ dòng lệnhscreen
của bạn:echo supercalifragilisticexpialidocious
-
Bây giờ, sao chép năm ký tự liên tiếp (từ trái sang phải) trong dòng ngay phía trên con trỏ của bạn:
Chúng ta vào chế độ sao chép: Ctrl+a-[ hoặc Ctrl+a-: rồi gõ
copy
. Sau đó, di chuyển đến dòng trên bằng cách sử dụngk
và nhấn Space để đánh dấu việc bắt đầu vùng chọn. Cuối cùng, di chuyển về phía trước bốn ký tự bằng cách sử dụngl
và nhấn lại Space để đánh dấu kết thúc vùng chọn. -
Cuối cùng, dán vùng chọn (
stice
) trở lại vào dấu nhắc lệnh:Ctrl+a-]
-
-
Giả sử bạn muốn chia sẻ phiên
tmux
(our_session
) với người dùng khác. Bạn đã tạo ổ nối (/tmp/our_socket
) với các quyền phù hợp để cả bạn và người dùng khác đều có thể đọc và ghi được. Cần đáp ứng hai điều kiện nào khác để người dùng thứ hai có thể đính thành công phiên thông quatmux -S /tmp/our_socket a -t our_session
?Cả hai người dùng phải có một nhóm chung, ví dụ như
multiplexer
. Sau đó, bạn cũng sẽ phải thay đổi ổ nối theo nhóm đó:chgrp multiplexer /tmp/our_socket
.