Sử dụng lệnh screen cơ bản
screen
là một phần mềm (chạy ở chế độ dòng lệnh) trên Linux rất hữu ích.
1. screen
giải quyết vấn đề gì?
Vấn đề
: Khi bạn kết nối bằngSSH
đếnserver
qua 1 terminal, bạn có thể gặp các vấn đề sau:- Chương trình bạn định chạy (train 1 con AI, down phim XXX) sẽ rất mất thời gian, bạn không thể đợi đến khi nó xong được. Bạn muốn nó vẫn chạy kể cả khi bạn tắt
terminal
đi về, hôm sau đến vẫn có cáiterminal
cũ.
- Chương trình bạn định chạy (train 1 con AI, down phim XXX) sẽ rất mất thời gian, bạn không thể đợi đến khi nó xong được. Bạn muốn nó vẫn chạy kể cả khi bạn tắt
- Bạn muốn chạy 2,3,… chương trình một lúc một lúc, chương trình nào cũng bắn lỗi ra
STDOUT
, và bạn phải kiểm tra được tình trạng lỗi của mỗi chương trình một cách riêng biệt để fix bug, điều chỉnh dựa trênLOG
của nó.
- Bạn muốn chạy 2,3,… chương trình một lúc một lúc, chương trình nào cũng bắn lỗi ra
- Bạn chán việc log lỗi chương trình bằng
redirect
chúng sangfile
.
- Bạn chán việc log lỗi chương trình bằng
screen
sinh ra để giải quyết các vấn đề ở trên.- Chỉ với một câu lệnh, bạn có thể giữ lại toàn bộ trạng thái của
terminal
, giúp cho chương trình vẫn chạy bình thường, cácterminal log
vẫn được ghi lại. - Chỉ với một kết nối
SSH
bạn có thể chạy bao nhiêu chương trình đồng thời tuỳ thích, mỗi chương trình sẽ cóterminal
(tức làSTDIN
,STDOUT
,STDERR
) riêng. - Chỉ bằng
screen
, bạn không cần mởDesktop
lên để chỉ để mở mộttab terminal
mới để chạy chương trình của bạn.
2. Một số khái niệm khi sử dụng và install
session
: Tức là mộtterminal ảo
doscreen
quản lý. Trên đó bạn làm được mọi thứ như trênterminal
thật. Chỉ khác một điều, khi bạn thoát (bằng lệnhexit
) thì nó sẽ huỷterminal
ảo thôi, và trở vềterminal
thật.windows
: Tức là một ô trênterminal
, trong đó chưa mộtterminal ảo
để bạn thực hiện lệnh.Cài đặt trên Ubuntu (với các Platform khác thì mình chịu)
sudo apt install screen
3. Các thao tác sử dụng cơ bản
3.1 Tạo một session mới và thoát khỏi
Giả sử ta có kết nối SSH
trên một terminal
thật với tên (chính title của cửa sổ ) : minatu2d@z600:~/screen_samplesample (ssh)
- Ta chạy
screen
command với không tham số (hay là mặc định):
screen
- Kết quả:
![screen_cmd_start_up](/post/images/screen_cmd_start_up.png)
- Sau khi nhấn `Enter` hoặc `Space` thì ta sẽ thấy như sau:
![screen_cmd_in_new_session](/post/images/screen_cmd_in_new_session.png)
- Đến đây, ta vẫn thấy một `terminal` như ở màn hình đầu tiên, ta vẫn có thể thực hiện mội lệnh bình thường.
- Bạn có thể để ý `title` của cửa sổ thay đổi như nào trong 3 màn hình ở trên không?
- Ở 2 màn hình dưới, `title` được đổi thành `screen` hay nói cách khác là `screen` đang được chạy đó.
- Cụ thể hơn nữa là, `screen` command đang chạy và tạo cho chúng ta một `terminal ảo` hay còn gọi với tên `session` (như đã giải thích ở trên)
Bạn có thể thêm tham số cho câu lệnh ở trên:
- Gán tên cho
session
:
screen -S <Tên của session>
- Thay đổi title của windows khi chạy vào session
screen -t <Tên của của sổ>
- Gán tên cho
Để thoát khỏi
session
vừa được tạo và trở vềterminal thật
, ta sử dụng lệnhexit
trong chínhterminal ảo
:
exit
- Khi thoát khỏi thì `session` cũng sẽ bị huỷ và ta sẽ trở về `terminal thật` với `title` được thay đổi theo.
3.2 Kiểm tra xem có đang ở trong 1 session hay không
Như bạn cũng thấy, khi chuyển từ
terminal thật
vàoterminal ảo
, gần như chúng ta không thấy có sự thay đổi nhiều. Nên nhiều khi khó nhận biết là chúng ta đang chạy trongterminal thật
hayterminal ảo
.- Ví dụ :khi chúng ta định chạy lệnh
exit
chẳng hạn.
- Ví dụ :khi chúng ta định chạy lệnh
Có một cách để kiểm tra chúng ta đang ở đâu, đó là kiểm giá trị biến môi trường
$STY
(biến này đượcscreen
command sử dụng để lưu tên củasession
hiện tại), câu lệnh:
echo $STY
- Nếu có giá trị (eg: `11822.pts-1.z600`) -> ta đang ở trong `terminal ảo` hay `session` nào đó.
- Giá trị trả về sẽ cho ta biết tên của session đó.
- Nếu không có gía trị -> ta đang ở `terminal thật`.
3.3 Nhả (detach) session hiện tại
Ta muốn
session
vẫn sống, tức là chỉ ra ngoàiterminal thật
tạm thời và sẽ quay lại, ta gọi đó làdeattach
:- Tổ hợp phím:
Ctrl + A
+D
.
- Tổ hợp phím:
Ví dụ: chúng ta phải chạy 1 task để download một file lớn, lấy ví dụ: Ubuntu ultimate edition 5.0 LTS
- Bật một
session
với tênDownload
từterminal thật
screen -S "Download"
- Sau khi vào
terminal ảo
rồi, chạy câu lệnh download bằngwget
wget https://jaist.dl.sourceforge.net/project/ultimateedition/ultimate-edition-5.0-x64-lite-mate.iso
Nhả
session
hiện tại bằngCtrl + A
+D
. Và trở lạiterminal thật
Giả sử, sau một thời gian muốn quay lại xem tiến độ download đến đâu, ta thực hiện từ
terminal thật
:
screen -r "Download"
- Ta lại quay trở lại
session
mà ta đãdetach
.
- Bật một
3.4 Gắn lại (re-attach) session cũ
- Ở phần trên ta cũng có thực hiện rồi, ở
terminal thật
, ta thực hiện lệnh
screen -r <tên hoặc id của session muốn re-attach>
- Và không cần phải gõ đầy đủ `tên` hay `id` của `session`, ta chỉ cần gõ đủ để `screen` phân biệt và tìm ra duy nhất là được.
- Nếu ta không nhớ
session
cótên
hoặcid
là gì, ta có thể xem danh sáchsession
hiện tại bằng:- Tham số
-ls
, như ở dưới đây, ta có 3session
đã ở trạng tháidetach
$ screen -ls There are screens on: 17489.Testing AI (02/23/2020 02:06:04 PM) (Detached) 17446.Training AI (02/23/2020 02:05:49 PM) (Detached) 16556.Download (02/23/2020 01:36:07 PM) (Detached) 3 Sockets in /run/screen/S-anhca.
- Tham số
3.5 Dừng session
Dừng tự nhiên: Tức là từ trong 1
terminal ảo
haysession
, ta thực hiện tự thoái- Bằng lệnh
exit
, đơn giản ta chạy lệnh này trongterminal ảo
muốn thoát.
exit
- Bằng
shortcut key
:Ctrl + A
+K
. (K
nghĩa làKill
đó). Khi thực hiện tổ hợp phím này trongterminal ảo
, rồi nhấn thêmy
nữa là ta sẽ thoát khỏisession
vào trở vềterminal thật
:
- Bằng lệnh
Dừng ép buộc: Tức là dừng một
terminal ảo
từ bên ngoài, ở đây là từterminal thật
.- Sau khi có được
tên
hoặcid
củasession
muốn tắt. Từ bên ngoàiterminal thật
, thực hiện lệnh sau:
screen -X -S <name hoặc id của session> quit
- Sau khi có được
3.6 Ghi lại log của toàn bộ 1 session
- Việc lấy log khi chạy chương trình là một việc làm phổ biến. Một số trường hợp sử dụng:
- Lấy làm bằng chứng chạy chương trình
- Lấy log để phân tích lỗi …
screen
cung cấp cơ chế cho phép ghi lại toàn bộ log củaterminal ảo
ra file.- Hay nói các khác,
screen
lưu lại toàn bộ gồm: lệnh đã gõ, kết quả hiển thị ra của mỗi câu lệnh vào file.
- Hay nói các khác,
- Mặc định,
screen
không ghi log file đâu, chúng ta sẽ bật nó:- Trong 1
terminal ảo
, ta gõCtrl + A
+H
(chữ hoa). (H
ở đây làHistory
đấy), thì bắt đầu tại thời điểm đólog
sẽ được ghi lại. - Sau khi ta thực hiện một vài lệnh hoặc chạy chương trình, ta sẽ dừng việc ghi log lại, với cùng tổ hợp phím :
Ctrl + A
+H
. - Như bạn cũng thấy, tên file là
screen.0
hiện ở góc trái dưới của màn hình. Đây là tên file mặc định. Số0
ở đây là số thứ tự doscreen
tự đánh dấu cho mỗisession
- Trong 1
- Để xem nội dung của file
screen.0
ở trên, ta sử dụng:less -r
. Vì do có một số kí tự điều kiển được ghi lại trong file log nên nếu xem bằngvim
hoặccat
ta sẽ thấy chúng.- Tôi recommend sử dụng
less -r
trong trường hợp này:
less -r screen.0
- Tôi recommend sử dụng
4. Kết và một số phím tắt
- Nói chúng,
screen
là một công cụ rất hữu dụng trong môi trường có nhiều user cùng sử dụng một tài nguyên tính toán thông qua kết nối từ xa:SSH
,Telnet
,Serial
. - Một số phím tắt:
Shortcut key Chức năng Ctrl + A
+d
Detach session hiện tại Ctrl + A
+H
(H : chữ hoa)Bắt đầu/kết thúc ghi log cho 1 session Ctrl + A
+k
Thoát (và huỷ) session hiện tại Ctrl + A
+?
Xem danh sách phím tắt