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:49
  • 1 day
  • 2 users
  • Load average
  • Thời gian hoạt động hiện tại
  • Thời gian uptime
  • Số lượng user
  • 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
  • 1 running
  • 163 sleeping
  • 0 stopped
  • 0 zombie
  • Tổng số tiến trình đang ở chế độ active
  • Số tiến trình đang chạy
  • Số tiến trình đang ở chế độ ngủ
  • Số tiến trình đang stop
  • 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
  • 0.3%sy
  • 0.0%ni
  • 99.7%id
  • 0.0%wa
  • 0.0%hi
  • 0.0%si
  • 0.0%st
  • %CPU được dùng cho từng tiến trình của user
  • %CPU được dùng cho từng tiến trình của hệ thống
  • %CPU được dùng để cấu hình các giá trị
  • %CPU ở trạng thái nghỉ
  • %CPU đang chờ trong thời gian chờ I/O
  • %CPU được dùng cho phần cứng khi bị gián đoạn
  • %CPU được dùng cho phần mềm khi bị gián đoạn
  • %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
  • 282728k used
  • 1200868k free
  • 379628k buffers
  • Tổng dung lượng RAM
  • Dung lượng RAM đang được sử dụng
  • Dung lượng RAM free
  • Dung lượng Buffers
Dòng 5: Liên quan đến thông tin Swap
  • 2097148k total
  • 0k used
  • 2097148k free
  • 1333080k cached
  • Tổng dung lượng Swap
  • Dung lượng Swap Ram đang sử dụng
  • Dung lương Swap free
  • 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
  • USER – root
  • PR – 20
  • NI – 0
  • VIRT - 0m
  • RES - 0m
  • SHR – 0
  • S – S
  • %CPU – 0.3
  • %MEM – 0.0
  • TIME+ - 0:00.98
  • COMMAND
  • Mã ID của tiến trình
  • User root đang thực thi tiến trình
  • Độ ưu tiên của tiến trình
  • Giá trị nice value của tiến trình
  • Dung lượng Ram ảo thực hiện cho 1 tiến trình
  • Dung lượng RAM thực chạy 1 tiến trình
  • Dung lượng RAM share cho 1 tiến trình
  • Trạng thái tiến trình đang hoạt động
  • %CPU được sử dụng cho tiến
  • %MEM được dùng sử dụng cho tiến trình
  • Tổng thời gian thực hiện cho tiến trình
  • 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:

    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]