Quản lý tiến trình trên Linux Image Quản lý tiến trình trên Linux

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 bgfg để chạy một quá trình trong nền.

Background và Foreground

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ụ:

Lệnh top

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:49Thời gian hoạt động hiện tại
1 dayThời gian uptime
2 usersSố lượng user
Load averageThờ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 totalTổng số tiến trình đang ở chế độ active
1 runningSố tiến trình đang chạy
163 sleepingSố tiến trình đang ở chế độ ngủ
0 stoppedSố tiến trình đang stop
0 zombieSố 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 totalTổng dung lượng RAM
282728k usedDung lượng RAM đang được sử dụng
1200868k freeDung lượng RAM free
379628k buffersDung lượng Buffers

Dòng 5: Liên quan đến thông tin Swap

2097148k totalTổng dung lượng Swap
0k usedDung lượng Swap Ram đang sử dụng
2097148k freeDung lương Swap free
1333080k cachedTổ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 – 120949Mã ID của tiến trình
USER – rootUser root đang thực thi tiến trình
PR – 20Độ ưu tiên của tiến trình
NI – 0Giá trị nice value của tiến trình
VIRT - 0mDung lượng Ram ảo thực hiện cho 1 tiến trình
RES - 0mDung lượng RAM thực chạy 1 tiến trình
SHR – 0Dung lượng RAM share cho 1 tiến trình
S – STrạ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.98Tổng thời gian thực hiện cho tiến trình
COMMANDTê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:

Quy ước 6 tường trong lệnh crontab

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út
  • h 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ả:

Kết quả chạy lệnh time bah của sleep

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

Tạm dừng tiến trình bằng lệnh kill

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

Chấm dứt tất cả các tiến trình khớp

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

Chấm dứt tất cả các tiến trình khớp

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

Chấm dứt tất cả các tiến trình khớp

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]