Bài viết này sẽ giới thiệu về quản lí tiến trình trên hệ điều hành Linux.
1. Tiến trình Background , Foreground
Các tiến trình nhận tương tác từ người dùng thì hoạt động ở chế độ mặt trước (foreground).
Các tiến trình không nhận tương tác thì hoạt động ở chế độ nền (background).
Các tiến trình thường chuyển qua chuyển lại giữa hai trạng thái này trong quá trình hoạt động, việc chuyển trạng thái có thể thực hiện do người dùng, do lệnh từ shell hoặc do lập trình.
Tiến trình ở chế độ mặt trước thường nhận được nhiều CPU hơn một chút so với chế độ nền.
Sử dụng CTRL-Z để tạm dừng một công việc nền trước hoặc CTRL-C để chấm dứt một công việc nền trước và có thể sử dụng các lệnh bg
và fg
để chạy một quá trình trong nền.
2. Lệnh ps
Lệnh ps
trên Linux là một trong những lệnh cơ bản nhất để xem các tiến trình đang chạy trên hệ thống. Nó cung cấp danh sách các tiến trình hiện tại cùng với các thông tin chi tiết khác như id người dùng, cách sử dụng CPU, sử dụng bộ nhớ, tên lệnh …
ps [option]
Để xem các option ta thực hiện lệnh: man ps
2.1: Lệnh ps loại System V
Lệnh ps
sẽ hiển thị tất cả các quy trình đang chạy trong trình bao hiện tại.
Sử dụng tùy chọn -u
để hiển thị thông tin của các quy trình cho tên người dùng được chỉ định.
Lệnh ps -ef
hiển thị tất cả các tiến trình trong hệ thống một cách chi tiết.
Lệnh ps -eLf
hiển thị một dòng thông tin cho mỗi luồng.
2.2: Lệnh ps loại BSD
Lệnh ps
có một kiểu đặc tả tùy chọn khác, xuất phát từ UNIX của BSD, trong đó các tùy chọn được chỉ định mà không có dấu gạch ngang trước.
Ví dụ:
Lệnh ps aux
hiển thị tất cả các quy trình của tất cả người dùng.
Lệnh ps axo
cho phép bạn chỉ định thuộc tính nào bạn muốn xem.
3. Lệnh xem danh sách xử lý của hệ thống
top
Lệnh top
là một trong những lệnh cực kì quạn trọng với chúng ta khi sử dụng hệ thống linux. Quản trị được các thông số, CPU, RAM, I/O, các tiến trình đang hoạt động trên hệ thống.
Lệnh trên giúp chúng ta có thể giám sát hệ thống của mình một cách chuyên nghiệp và nắm rõ từng thông tin của hệ thống. Lệnh top tương tự Task manager trên windows.
Ví dụ:
Các phím thông dụng trong khi dùng lệnh top:
Nhấn Ctrl + c hoặc q để thoát khỏi lệnh "top".
Nhấn h để xem hướng dẫn, và nhấn ESC trở lại màng hình chính.
Nhấn f để thêm hoặc bớt các Field, sắp xếp trên Field hoặc đổi thứ tự các Field.
Theo Hình trên thì:
Dòng 1: Liên quan đến thời gian của Server
19:43:49 | Thời gian hoạt động hiện tại |
1 day | Thời gian uptime |
2 users | Số lượng user |
Load average | Thời gian CPU load trung bình 1/5/15 phút. 0.02: 1 phút, 0.05: 5 phút, 0.05: 15 phút |
Dòng 2: Liên quan đến thông tin của tiến trình
164 total | Tổng số tiến trình đang ở chế độ active |
1 running | Số tiến trình đang chạy |
163 sleeping | Số tiến trình đang ở chế độ ngủ |
0 stopped | Số tiến trình đang stop |
0 zombie | Số tiến trình chờ stop từ tiến trình khác |
Dòng 3: Liên quan đến thông tin CPU
0.0%us | %CPU được dùng cho từng tiến trình của user |
0.3%sy | %CPU được dùng cho từng tiến trình của hệ thống |
0.0%ni | %CPU được dùng để cấu hình các giá trị |
99.7%id | %CPU ở trạng thái nghỉ |
0.0%wa | %CPU đang chờ trong thời gian chờ I/O |
0.0%hi | %CPU được dùng cho phần cứng khi bị gián đoạn |
0.0%si | %CPU được dùng cho phần mềm khi bị gián đoạn |
0.0%st | %CPU ảo chờ đợi CPU thực xử lý các tiến trình |
Dòng 4: Liên quan đến thông tin RAM
1863224k total | Tổng dung lượng RAM |
282728k used | Dung lượng RAM đang được sử dụng |
1200868k free | Dung lượng RAM free |
379628k buffers | Dung lượng Buffers |
Dòng 5: Liên quan đến thông tin Swap
2097148k total | Tổng dung lượng Swap |
0k used | Dung lượng Swap Ram đang sử dụng |
2097148k free | Dung lương Swap free |
1333080k cached | Tổng cache memory bởi hệ thống |
Dòng 6: Các tham số của các tiến trình đang hoạt động
PID – 120949 | Mã ID của tiến trình |
USER – root | User root đang thực thi tiến trình |
PR – 20 | Độ ưu tiên của tiến trình |
NI – 0 | Giá trị nice value của tiến trình |
VIRT - 0m | Dung lượng Ram ảo thực hiện cho 1 tiến trình |
RES - 0m | Dung lượng RAM thực chạy 1 tiến trình |
SHR – 0 | Dung lượng RAM share cho 1 tiến trình |
S – S | Trạng thái tiến trình đang hoạt động |
%CPU – 0.3 | %CPU được sử dụng cho tiến trình |
%MEM – 0.0 | %MEM được dùng sử dụng cho tiến trình |
TIME+ - 0:00.98 | Tổng thời gian thực hiện cho tiến trình |
COMMAND | Tên tiến trình |
4. Lập lịch chạy tiến trình tương lai bằng cron và sleep
4.1: Lệnh cron
Cron là một tiến ích giúp chúng ta lập kế hoạch chạy những dòng lệnh trên server để thực hiện 1 hoặc nhiều công việc dựa trên thời gian được lập sẵn. Cron là một chương trình được chạy ngầm mãi một khi nó được khởi động lên.
Cron được điều khiển bởi một tệp cấu hình có tên /etc/crontab chức các lệnh shell khác nhau cần được chạy vào thời gian được lên lịch chính xác.
Có tệp crontab trên toàn hệ thống và tệp crontab cho mỗi người dùng.
Mỗi dòng của tệp crontab đại diện cho một công việc và bao gồm một biểu thức được gọi là CRON , theo sau là một lệnh shell để thực thi.
Để mở trình soạn thảo crontab chỉnh sửa các công việc hoặc tạo công việc mới ta dùng lệnh:
crontab -e
Mỗi dòng của tệp crontab chứa 6 trường:
Ví dụ:
Cấu hình trong file crountab -e
* * * * * */usr/local/bin/execute/this/script.sh
Nó sẽ sắp xếp công việc để thực thi script.sh mỗi phút mỗi giờ mỗi ngày trong tháng và mỗi tháng và mỗi ngày trong tuần.
Ví dụ:
Cấu hình trong file crountab -e
30 08 10 06 * /home/sysadmin/full-backup
Nó sẽ lên lịch sao lưu toàn bộ vào 8h30 sáng, 10 tháng 6, bất kể ngày nào trong tuần.
4.2: Lệnh sleep
Lệnh sleep được sử dụng để trì hoãn trong một khoảng thời gian cố định trong quá trình thực thi bất kỳ tập lệnh nào. Cần tạm dừng việc thực hiện bất kỳ lệnh nào cho mục đích cụ thể thì lệnh này được sử dụng với giá trị thời gian cụ thể. Bạn có thể đặt mức độ trễ theo giây (s), phút (m), giờ (h) và ngày (d). Sau khi kết thúc thời gian việc thực thi sẽ tiếp tục thực hiện.
sleep [SUFFIX]. . .
Trong đó SUFFIX là:
s
trong vài giây ( mặc định )m
trong vài phúth
hàng giờd
trong nhiều ngày
Ví dụ: Trong đoạn script sau, lệnh ngủ chỉ được sử dụng với giá trị số 2 và không có hậu tố nào được sử dụng.
#!/bin/bash
echo "Waiting for 2 seconds..."
sleep 2
echo "Task Completed"
Chạy tệp bash với lệnh time để hiển thị ba loại giá trị thời gian để chạy tập lệnh. Đầu ra hiển thị thời gian được sử dụng bởi một hệ thống, người dùng và thời gian thực.
time bash sleep.sh
Kết quả:
5. Lệnh bg
Lệnh bg
trên hệ điều hành linux được sử dụng để đặt các công việc nền. Cú pháp cơ bản của lệnh bg
:
bg [job_spec...]
Trong đó job_spec
có thể là:
- %n: Tham gia công việc số n.
- %str: Tham gia công việc một lệnh bắt đầu bằng str.
- %?str: Tham khảo công việc được bắt đầu bằng lệnh chứa str.
- %-: Tham gia công việc trước đó.
Ví dụ: Đầu tiên chúng ta dùng lệnh jobs
để liệt kê các công việc. Chúng ta tạo công việc sleep
và nhận được tiến trình ID là 1 sau đó muốn công việc đó chạy nền thì cung cấp ID của nó cho lệnh bg
.
[root@test1 ~]# jobs
[root@test1 ~]# sleep 500
[1]+ Stopped sleep 500
[root@test1 ~]# jobs
[1]+ Stopped sleep 500
[root@test1 ~]# bg %1
[1]+ sleep 500 &
[root@test1 ~]# jobs
[1]+ Running sleep 500 &
6. Lệnh fg
Lệnh fg
trên hệ điều hành linux được sử dụng để tắt các công việc nền. Cú pháp cơ bản của lệnh bg
:
fg [job_spec...]
Trong đó job_spec
có thể là:
- %n: Tham gia công việc số n.
- %str: Tham gia công việc một lệnh bắt đầu bằng str.
- %?str: Tham khảo công việc được bắt đầu bằng lệnh chứa str.
- %-: Tham gia công việc trước đó.
Ví dụ: Tắt công việc nền đang hoạt động.
[root@test1 ~]# jobs
[1]+ Running sleep 500 &
[root@test1 ~]# fg %1
[1]- Done sleep 500
[root@test1 ~]# jobs
[1]+ Stopped sleep 500
7. Lệnh jobs
Lệnh jobs dùng liệt kê tất cả trạng thái các công việc đang chạy. Cú pháp cơ bản của lệnh jobs
:
jobs [tuỳ chọn] [job_spec...]
Các tủy chọn thường sử dụng là:
- -l: Hiển thị trạng thái và ID quá trình của tất cả các công việc.
- -p: Hiển thị ID quy trình của tất cả các công việc.
Ví dụ: Hiển trạng thái và ID của công việc
[root@test1 ~]# jobs
[root@test1 ~]# sleep 500
[1]+ Stopped sleep 500
[root@test1 ~]# jobs
[1]+ Stopped sleep 500
8. Lệnh kill và killall
8.1 Lệnh kill
Lệnh kill
được dùng để gửi tín hiệu để dừng một tiến trình thông qua số PID hoặc ID. Để thực hiện lệnh kill
chúng ta thực hiện như sau:
kill [tùy chọn] [process_id]
Để hiểu hơn về lệnh kill chúng ta đọc các tùy chọn sau:
Chấm dứt chương trình bằng tín hiệu SIGINT. Điều này thường được bắt đầu bởi người dùng nhấn Ctrl + C:
kill -2 [process_id]
Báo cho hệ điều hành chấm dứt ngay một tiến trình:
kill -9 [process_id]
Báo hiệu hệ điều hành để tạm dừng chương trình cho đến khi nhận được tín hiệu SIGCONT ("tiếp tục"):
kill -17 [process_id]
Ví dụ: Sử dụng lệnh kill
để dừng một tiến trình có tên python
8.2 Lệnh killall
Lệnh killall
được dùng để gửi tín hiệu đến tiến trình dùng để dừng một tiến trình thông qua tên tiến trình. Để thực hiện lệnh killall
chúng ta thực hiện như sau:
killall [process name]
Trong đó [process name] được thay bằng tên tiến trình bạn muốn dừng.
Ví dụ: Chấm dứt tiến trình python dùng lệnh killall
9. Lệnh free
Lệnh free
được dùng để hiển thị thông tin về dung lượng RAM và ảo SWAP trên hệ điều hành Linux. Cấu trúc của lệnh free
:
free [tùy chọn]
Các tuỳ chọn có thể là:
- -b: Thống kê dung lượng theo đơn vị bytes.
- -k: Thống kê dung lượng theo đơn vị kilobytes.
- -m: Thống kê dung lượng theo đơn vị megabytes.
- -g: Thống kê dung lượng theo đơn vị gigabyte.
- -h: Hiển thị thông tin dung lượng RAM va SWAP cho người dùng có thể dể hiểu hơn -h ở đây có nghĩa là --human.
Để xem thêm các tùy chọn về lệnh free
chúng ta dùng lệnh: man free
Ví dụ: Hiển thị dung lượng RAM và SWAP
[root@test1 ~]# free -h
total used free shared buff/cache available
Mem: 2.0G 84M 1.5G 72M 380M 1.6G
Swap: 511M 0B 511M
10. Lệnh uptime
Lệnh uptime
cho biết hệ thống chạy được bao lâu.
Một số ví dụ về lệnh uptime
:
Ví dụ 1: In thời gian hiện tại, thời gian hoạt động, số lượng người dùng đăng nhập và thông tin khác
[root@test1 ~]# uptime
20:04:17 up 210 days, 21:45, 1 user, load average: 0.00, 0.01, 0.05
Ví dụ 2: Chỉ hiển thị lượng thời gian hệ thống đã được khởi động cho
[root@test1 ~]# uptime --pretty
up 30 weeks, 21 hours, 46 minutes
Ví dụ 3: In ngày và giờ hệ thống khởi động tại
[root@test1 ~]# uptime --since
2018-08-07 22:19:00
Ví dụ 4: Hiển thị thông tin phiên bản
[root@test1 ~]# uptime --version
uptime from procps-ng 3.3.10
11. Lệnh pgrep
Lệnh pgrep
tìm hoặc xử lí tín hiệu theo tên của tiến trình.
Các ví dụ về lệnh pgrep
:
Ví dụ 1: Trả về các PID của bất kỳ tiến trình đang chạy
[root@test1 ~]# ps aux | grep python
root 809 0.0 0.8 573848 16972 ? Ssl 2018 51:44 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 4547 0.0 0.2 130152 4892 pts/0 T 21:05 0:00 python
root 4555 0.0 0.0 112704 972 pts/0 S+ 21:08 0:00 grep --color=auto python
[root@test1 ~]# pgrep python
4547
Ví dụ 2: Tìm kiếm tiến trình được chạy bởi một người dùng cụ thể
[root@test1 ~]# ps aux | grep python
root 809 0.0 0.8 573848 16972 ? Ssl 2018 51:44 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 4547 0.0 0.2 130152 4892 pts/0 T 21:05 0:00 python
root 4555 0.0 0.0 112704 972 pts/0 S+ 21:08 0:00 grep --color=auto python
[root@test1 ~]# pgrep -u root python
4547
12 Lệnh pkill
Lệnh pkill
dùng để quản lí tiến trình theo tên. Chủ yếu được sử dụng để dừng quá trình.
Một vài ví dụ về lệnh pkill
:
Ví dụ 1: Chấm dứt tất cả các tiến trình có tên khớp với tên mà người dùng cần pkill
Ví dụ 2: Chấm dứt tất cả các tiến trình khớp với lệnh đầy đủ của chúng thay vì chỉ tên quy trình
13. Lệnh watch
Lệnh watch
dùng để thực hiện chương trình định kì, hiển thị toàn màn hình đầu ra.
Ví dụ: chúng ta cần chuyển 1 file 100GB qua một server khác, chúng ta muốn kiểm tra xem kích thước của file đó bên server kia tới đâu rồi nên hay phải dùng lệnh ls -lh 100GB.txt
lặp đi lặp lại.
Có một cách khác để tự động thực thi lệnh trên mỗi 2s (mặc định) bằng lệnh watch
như sau:
watch ls -l 100GB.txt
14. Lệnh screen
Lệnh screen
mở một phiên màn hình mới trên một máy chủ từ xa. Quản lý nhiều cửa sổ với một kết nối SSH.
Một số ví dụ về lệnh screen
:
Ví dụ 1: Bắt đầu một phiên màn hình mới
screen
Ví dụ 2: Bắt đầu một phiên màn hình mới được đặt tên
screen -S [session_name]
Ví dụ 3: Hiển thị phiên màn hình mở
screen -ls
Ví dụ 4: Di chuyển đến một màn hình mở:
screen -r {{session_name}}
Ví dụ 5: Tắt một màn hình được mở:
screen -X -S [session_name] quit
Ví dụ 6: Khi sử dụng lệnh screen
chúng ta có thể thoát màn hình như sau:
Cách tách màn hình 1: Thoát màn hình bằng CTRL + A d
Khi lệnh đang thực thi, nhấn tổ hợp phím CTRL + A theo sau là d để tách màn hình.
Cách tách màn hình 2: Thoát màn hình bằng tùy chọn
-d
Khi lệnh đang chạy, chúng ta gõ lệnh như sau:
screen -d [SCREENID]
Trong đó SCREENID dùng lệnh
screen -ls
để xem ID màn hình cần thoát.
15. Lệnh nice và lệnh renice
15.1. Lệnh nice
Lệnh nice
thực hiện một chương trình với một ưu tiên lập lịch tùy chỉnh . Giá trị dao động từ -20 (mức ưu tiên cao nhất) đến 19 (mức thấp nhất).
Ví dụ: Khởi chạy một chương trình với độ ưu tiên
nice -n [niceness_value] [command]
15.2. Lệnh renice
Lệnh renice
dùng thay đổi mức độ ưu tiên của một hoặc nhiều tiến trình đang chạy. Giá trị độ bền dao động từ -20 (thuận lợi nhất cho tiến trình) đến 19 (ít thuận lợi nhất cho tiến trình).
Ví dụ 1: Thay đổi mức độ ưu tiên của quy trình đang chạy
renice -n [niceness_value] -p [pid]
Ví dụ 2: Thay đổi mức độ ưu tiên của tất cả các quy trình thuộc sở hữu của người dùng
renice -n [niceness_value] -u [user]
Ví dụ 3: Thay đổi mức độ ưu tiên của tất cả các quy trình thuộc về một nhóm quy trình
renice -n [niceness_value] --pgrp [process_group]