Quản lý các tiến trình trong Linux.
I.Process
1.Một số thuật ngữ.
- process: process (tiến trình) là mã nguồn hoàn thiện mà đang chạy trên hệ thống.
- PID: mọi tiến trình đều có một process ID hay PID để hệ thống có thể quản lý chúng.
- PPID: ngoại trừ init thì mọi tiến trình đều có tiến trình cha (với một PPID). Tiến trình con thường được mở bởi tiến trình cha.
- init: Tiến trình init luôn có PID là 1. Nó được khởi động bởi kernel nên nó không có tiến trình cha.
- kill: Khi bạn muốn một tiến trình dừng, bạn kill nó.
- daemon: Là những tiến trình khởi động khi hệ thống khởi động và tiếp tục chạy mãi. Những tiến trình daemon không bao giờ chết.
- zombie: Khi một tiến trình chết nhưng nó vẫn hiển thị trên hệ thống thì nó được gọi là zombie. Bạn không thể kill tiến trình zombie vì chúng đã chết rồi.
2.Quản lý tiến trình cơ bản
- **\(và $PPID**:\) là biến lưu trữ PID của shell hiện tại, $PPID là biến chứa PPID của shell hiện tại.
root@m4700:~# echo $$ $PPID 15067 15057
- pidof: là lệnh giúp bạn hiển thị tất cả PID bằng tên của tiến trình.
root@m4700:~# pidof chrome 14809 14390 14374 13625 6844 6817
- Parent and child: Các tiến trình có quan hệ cha - con. Mọi tiến trình đều có tiến trình cha.
root@m4700:~# echo $$ $PPID 15067 15057 root@m4700:~# bash root@m4700:~# echo $$ $PPID 15266 15067
-
fork và exec: Một tiến trình mở một tiến trình khác trong hai giai đoạn. Đầu tiên nó tạo một fork của nó, một bản copy. Sau đó tiến trình fork đó thực thi một hàm exec để thay thế tiến trình fork bằng tiến trình con mà nó muốn chạy.
- exec command: Với lệnh
exec
bạn có thể thực thi một tiến trình mà không cần fork một tiến trình mới. Tiến trình mới sẽ thay thế tiến trình cũ và có PID của tiến trình cũ. ```bash root@m4700:~# echo $$ 15657 root@m4700:~# exec shecho $$
15657
- **ps**: Là lệnh thông dụng để xem các tiến trình trên hệ thống.
- **psgrep**: Là lệnh để tìm kiếm tiến trình bằng tên lệnh
root@m4700:~# pgrep -lx bash 15785 bash 15947 bash 15957 bash 15967 bash
- **pstree** Giống lệnh ps nhưng khác là nó hiển thị các process dưới dạng cây và thể hiện rõ quan hệ cha-con.
root@m4700:~# pstree systemd─┬─ModemManager───2[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2[{NetworkManager}] ├─accounts-daemon───2[{accounts-daemon}] ├─acpid ├─apache2───5[apache2] ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─boltd───2*[{boltd}]
- **ps -u <username>**: là lệnh để xem những process được thực hiện bởi một user nhất định.
- **ps -U <username>**: xem tất cả các process ngoai trừ process của user nào đó.
- **top**: top cũng là một công cụ phổ biến trên Linux. `top` có thể xem các thông tin của process như cpu đã sử dụng, ram sử dụng, và một số thông tin khác. Bạn có thể quản lý các tiến trình qua top.
## 3.Signaling process
- **kill**: Lệnh `kill` là lệnh dùng để kill(stop) một tiến trình với PID của nó. Khi thực hiện lệnh kill, nó gửi đến tiến trình một tín hiệu(signal)
- **kill -l**: là lệnh dùng để liệt kê tất cả các tín hiệu có thể được gửi đến một process đang chạy bởi người dùng hay process khác.
root@m4700:~# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
- **kill -1 (SIGHUP)**: là lệnh gửi tín hiệu SIGHUP đẻ báo với tiến trình nên đọc lại file cấu hình của nó.
- **kill -15 (SIGTERM)**: lệnh `kill -15` là lệnh gửi tín hiệu SIGTERM đến tiến trình để đóng tiến trình. Nó là mặc định nếu như không có option nào cho lệnh kill. Nhà phát triển của tiến trình đó có thể ngăn chặn việc đóng tiến trình khi nhận tín hiệu SIGTERM.
- **kill -9 (SIGKILL)**: lệnh `kill -9` là lệnh gửi tín hiệu SIGKILL nhưng *không phải là đến tiến trình* mà là đến *Linux kernel*. Linux kernel sẽ đóng đột ngột tiến trình. Nhà phát triển của tiến trình không thể ngăn chặn kill -9.
- **SIGSTOP và SIGCONT**: `kill -19` gửi tín hiệu *SIGSTOP* đến tiến trình và *tạm dừng* nó. Khi nó bị *tạm dừng*, nó không sử dụng CPU nhưng nó được lưu trong RAM và có thể được *hồi sinh* với lệnh `kill -18` (*SIGCONT*)
- **pkill**: là lệnh để kill một tiến trình với tên lệnh của nó.
```bash
root@m4700:~# sleep 1000 &
[1] 19396
root@m4700:~# pkill sleep
[1]+ Terminated sleep 1000
-
killall: giống với pkill, lệnh killall cũng dùng để gửi tín hiệu đến process theo tên. Mặc định là gửi tín hiệu 15 (SIGTERM).
-
killall5: là lệnh dùng để gửi tín hiệu đến tất cả các tiến trình. Thường được dùng khi tắt hệ thống.
-
top: trong top có thể dùng phím k đẻ chọn tín hiệu và pid để gửi tín hiệu đó đến process.
II.Process Priorities
1.Giá trị priority và nice.
- Mọi tiến trình đều có giá trị priority và nice.
Với giá trị priory càng thấp thì độ ưu tiên cho tiến trình càng cao. Bạn có thể thay đổi nó với lệnh
nice
vàrenice
. - giá trị nice nằm trong khoảng từ -20 đến +19, với giá trị mặc định là 0. Chỉ có các user root hoặc sudoer mới có quyền thay đổi giá trị nice thành các giá trị âm.
- Giá trị Priority thường có giá trị là PR= 20 + NI, nhưng tùy vào yêu cầu, linux kernel có thể thay đổi giá trị priority khác đi.
2. nice và renice
Khi một tiến trình đang chạy, chúng ta có thể thay đổi giá trị nice của tiến trình bằng lệnh renice
root@m4700:~# renice +20 6580
6580 (process ID) old priority -20, new priority 19
root@m4700:~# renice +15 6580
6580 (process ID) old priority 19, new priority 15
Với user thường chỉ có thể điều chỉnh giá trị nice từ 0 đến +19 cho tiến trình mà họ sở hữu, với user root là từ -20 đến 19.
Lệnh nice
có chức năng gần giống renice
nhưng nó được dùng khi chạy câu lệnh.
nice -10 bash
III.Background job.
- Foreground process (Tiến trình tương tác) - chúng được khởi tạo và kiểm soát bởi một terminal session. Lấy input từ người dùng và hiển thị output ra màn hình. Khi chạy tiến trình này, không thể truy cập vào command line để chạy cây lệnh khác.
- Background process (Tiến trình không tương tác) là tiến trình không kết nối với terminal. Không cần input từ người dùng. Khi chạy tiến trình này, nó không làm ảnh hưởng đến terminal session nên có thể chạy các tiến trình khác.
- jobs: Lệnh để hiển thị các tiến trình background.
- Control-Z: Dùng ctrl+z khi đang chạy một tiến trình sẽ làm tạm dừng tiến trình đó. Nó gửi SIGSTOP đến Linux kernal, làm đóng băng hoạt động của tiến trình. Những tiến trình này có thể được xem với lệnh
jobs
. ```bash root@m4700:~# vi test
[1]+ Stopped vi test root@m4700:~# jobs [1]+ Stopped vi test
- **&** : Những tiến trình background được chạy với & ở cuối cũng được hiển thị với `jobs`
```bash
root@m4700:~# tree / > /dev/null &
[2] 8335
root@m4700:~# jobs
[1]+ Stopped vi test
[2]- Running tree / > /dev/null &
- jobs -p: để xem PID của các tiến trình background.
root@m4700:~# jobs [1]- Running sleep 2000 & [2]+ Running sleep 3000 & root@m4700:~# jobs -p 8399 8400
- fg: Chạy lệnh
fg <số của background job>
để đưa một backgroud job đến foreground. ```bash root@m4700:~# jobs [1]- Running sleep 2000 & [2]+ Running sleep 3000 & root@m4700:~# fg 2 sleep 3000
```
- bg: lệnh
bg
là lệnh giúp chạy tiếp một tiến trình đang bị tạm dừng ở background bằng cách gửi tín hiệu SIGCONT .