[Linux] Process mangement

Bài viết tổng hợp một số lệnh cho việc quản lý tiến trình trong hệ điều hành Linux. Bên canh đó có 1 số lệnh chuyển kênh chuẩn và thực hiện xử lý song song các câu lệnh trong Linux.

1. Quản lý tiến trình

Một tiến trình = thực thi của một chương trình được thực thi.

Mỗi tiến trình sẽ tương ứng với một tập các thông tin sau:

  • Một định danh (pid)
  • Một tiến trình cha (ppid)
  • Người sở hữu (uid) và nhóm (gid)
  • Câu lệnh khởi tạo tiến trình
  • Một đầu vào chuẩn (stdin), một đầu ra chuẩn (stdout), một kênh báo lỗi chuẩn (stderr)
  • Thời gian sử dụng CPU (CPU time) và mức độ ưu tiên
  • Thư mục hoạt động hiện tại của tiến trình
  • Bảng các tham chiếu đến các file được tiến trình sử dụng.

Các tiến trình được sắp xếp để chia sẻ thời gian sử dụng CPU.

Có 2 loại tiến trình là tiến trình hệ thống và tiến trình của người dùng:

Các tiến trình hệ thống

  • Thường thuộc về quyền root
  • Không có giao diện tương tác
  • Thường được chạy dưới dạng các tiến trình ngầm (daemon)
  • Đảm nhiệm các nhiệm vụ chung, phục vụ mọi người sử dụng.
  • Ví dụ:
    • lpsched: Quản lý các dịch vụ in ấn
    • cron: tự động thực hiện một lệnh/chương trình vào một thời gian xác định trước.
    • inetd: quản lý các dịch vụ mạng.

Các tiến trình của người sử dụng

  • Thực hiện các nhiệm vụ của một người dùng cụ thể
  • Thực hiện dưới dạng một shell tương ứng với một sự đăng nhập.
  • Thực hiện dưới dạng một lệnh thông qua shell
  • Thường được thực hiện, quản lý bằng một terminal
  • Ví dụ: cp, vi, man

2. Lệnh ps, lsof

  • Hiển thị các tiến trình
  • Theo ngầm định, lệnh ps hiển thị các tiến trình thuộc về người sử dụng terminal.
  • Sử dụng tùy chọn ps -aux để hiển thị tất cả các tiến trình đang chạy trong máy.
  • Xem tiến trình với port: lsof (LiSt Open File)
    1
    2
    3
    sudo lsof -t -i:9001
    => kill process in port 9001:
    sudo kill $(sudo lsof -t -i:9001)

3. Các trạng thái của 1 tiến trình

  • S: đang ngủ
  • R: đang chạy
  • T: dừng
  • Z: không xác định

4. Lệnh kill

Lệnh này gửi một tín hiệu đến một tiến trình (định danh của tiến trình được xác định dưới dạng một tham số của lệnh).

Theo ngầm định, tín hiệu gửi đi là tín hiệu 15 (SIGTERM – kết thúc tiến trình)

Tùy chọn -9: gửi tín hiệu 9 (SIGKILL – hủy tiến trình)

Tùy chọn –l: liệt kê tất cả các tín hiệu có thể sử dụng.

Lệnh killall: dùng để kết thúc tất cả các tiến trình của một câu lệnh thông qua việc truyền tên của câu lệnh dưới dạng một tham số.

1
2
$ kill -9 1317
$ killall <process-name>

( kiểu như killall các tiến trình ở cổng 80)
Quyền hủy tiến trình thuộc về người sở hữu tiến trình.

Note:

Nói chung, bạn nên sử dụng kill (viết tắt của kill -s TERM, hoặc trên hầu hết các hệ thống kill -15) trước khi kill -9 (kill -s KILL) để tạo cơ hội tiến trình tự dọn dẹp sau đó. (Các quy trình không thể bắt hoặc bỏ qua SIGKILL, nhưng chúng có thể và thường bắt SIGTERM.) Nếu bạn không cho quá trình hoàn thành những gì nó đang làm và dọn sạch, nó có thể để lại các tệp bị hỏng (hoặc trạng thái khác) rằng nó sẽ không thể hiểu được khi khởi động lại.

=> Phải dọn dẹp hết những gì nó đang sử dụng thì lần sau khởi động lại mới được =))

Ref: https://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process

5. Các cách thực hiện song song các câu lệnh

  • cmd1 ; cmd2

Thực thi nhiều lệnh độc lập: Sử dụng ký tự ; để thực thi nhiều lệnh liên tiếp, các lệnh này hoạt động độc lập với nhau.

1
$cp public/* perso; rm -r public

  • cmd1 && cmd2

Thực thi nhiều lệnh phụ thuộc nhau

Sử dụng ký hiệu && để thực thi nhiều lệnh liên tiếp, các lệnh này phụ thuộc nhau, lệnh sau chỉ được thực hiện nếu lệnh trước không gặp lỗi.

1
$cp public/* perso && rm -r public

  • cmd1 | cmd2: Cơ chế đường ống:
    • Cơ chế đường ống giữa hai tiến trình cho phép định hướng lại đầu ra của tiến trình thứ nhất trở thành đầu vào của tiến trình thứ hai
    • Cơ chế đường ống được thiết lập bằng cách sử dụng ký tự: |

6. Chuyển hướng các kênh chuẩn

  • Mỗi tiến trình sở hữu:
    • Một đầu vào chuẩn (ngầm định là bàn phím)
    • Một đầu ra chuẩn (ngầm định là terminal)
    • Một kênh báo lỗi chuẩn (ngầm định là terminal)
  • Chuyển hướng đầu vào chuẩn (<)
    1
    $ tee < test.txt
  • Chuyển hướng đầu ra chuẩn (>, >>)
    1
    2
    $ ls > /dev/lp
    $ ls >> test.txt
  • Chuyển hướng kênh báo lỗi
    1
    2
    $ rm prog.c 2> /dev/null
    $ gcc prog.c 2>> erreur.txt

7. Lệnh grep : Tìm kiếm các dòng

Cú pháp chung: $grep [-options] expreg [files]

Tìm kiếm trong file hoặc trong đầu vào chuẩn các dòng có chứa các ký tự hoặc xâu thỏa mãn một số điều kiện nào đó.

Các tùy chọn

  • -c : chỉ đưa ra tổng số dòng thỏa mãn điều kiện
  • -I : chỉ đưa ra tên file
  • -v : chỉ đưa ra các dòng mà điều kiện tìm kiếm không thỏa mãn
  • -i : không phân biệt chữ hoa, chữ thường
  • -n: chỉ đưa ra số thứ tự của dòng
  • -w: thực hiện tìm kiếm với quá trình so sánh được thực hiện đối với từng từ của chuỗi nhập vào (các từ được phân cách nhau bằng các ký tự không phải là chữ cái, không phải là chữ số và không phải là dấu gạch dưới _)

Biểu thức chính quy:

  • . Biểu diễn 1 ký tự bất kỳ
  • * Lặp lại ký tự ở vị trí trước
  • ^ bắt đầu 1 dòng
  • $ kết thúc 1 dòng
  • [...] xác định danh sách hoặc một khoảng các ký tự cần tìm kiếm
  • [^..] các ký tự không tìm kiếm.

Chú ý: để tránh nhầm lẫn, nên đặt các ký tự biểu diễn điều kiện trong ngoặc kép.

Ví dụ:

1
2
3
4
5
6
7
8
$grep "^t" /etc/passwd
Tìm trong file /etc/passwd tất cả các dòng bắt đầu bằng ký tự “t”
$grep [^t] /etc/passwd
Tìm tất cả các dòng không bắt đầu bằng ký tự “t”
$grep "minh" /etc/passwd
Tìm tất cả các dòng có chứa xâu "minh"
$ls -l /etc | grep "^d"
Hiển thị tất cả các thư mục con của /etc

8. Case study

Trường hợp máy chạy quá nặng dẫn đến việc đơ máy
Có thể xem tiến trình nào đang chiếm nhiều CPU và bộ nhớ nhất

1
2
3
4
5
6
7
8
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7643 minhnv 20 0 2899196 261280 136296 S 15,2 6,7 0:06.87 firefox
5328 minhnv 20 0 1557244 298152 83328 S 8,9 7,6 7:27.92 chrome
6015 minhnv 20 0 1416656 259440 75936 S 8,9 6,6 0:47.91 chrome
7693 minhnv 20 0 2707144 227308 143388 S 7,3 5,8 0:03.79 Web Content
5340 minhnv 20 0 1219988 131676 54040 S 6,6 3,4 0:29.68 chrome
1510 root 20 0 401932 89864 75344 S 6,0 2,3 1:30.73 Xorg

Lúc này có thể kill một số tiến tình nặng đi để có thể trở về trạng thái bình thường (đa số các tiền trình nặng đều là do mở các trình duyệt).

Cách 1:

1
$ killall firefox

Cách 2:

1
2
$ ps -A | grep firefox
Sau đó kill từng tiến trình một

Author

Ming

Posted on

2019-11-22

Updated on

2021-04-10

Licensed under

Comments