Skip to content

Quản lý các tiến trình trong Linux#

Process#

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.

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@cloudtada:~# 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@cloudtada:~# 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@cloudtada:~# echo $$ $PPID
15067 15057
root@cloudtada:~# bash 
root@cloudtada:~# 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ũ.

root@cloudtada:~# echo $$
15657
root@cloudtada:~# exec sh
# echo $$
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@cloudtada:~# 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@cloudtada:~# 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.

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@cloudtada:~# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 2) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
1)  SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
2)  SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
3)  SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
4)  SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
5)  SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
6)  SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
7)  SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
8)  SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
9)  SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
10) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
11) 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ó.

root@cloudtada:~# sleep 1000 &
[1] 19396
root@cloudtada:~# 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.

Process Priorities#

Giá trị priority và nice#

  • Mọi tiến trình đều có giá trị prioritynice. 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 nicerenice.
  • 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.

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@cloudtada:~# renice +20 6580
6580 (process ID) old priority -20, new priority 19
root@cloudtada:~# 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

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.

root@cloudtada:~# vi test

[1]+  Stopped                 vi test
root@cloudtada:~# 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

root@cloudtada:~# tree / > /dev/null &
[2] 8335
root@cloudtada:~# jobs
[1]+  Stopped                 vi test
[2]-  Running                 tree / > /dev/null &

jobs -p: để xem PID của các tiến trình background.

root@cloudtada:~# jobs
[1]-  Running                 sleep 2000 &
[2]+  Running                 sleep 3000 &
root@cloudtada:~# jobs -p
8399
8400

fg: Chạy lệnh fg <số của background job> để đưa một backgroud job đến foreground.

root@cloudtada:~# jobs
[1]-  Running                 sleep 2000 &
[2]+  Running                 sleep 3000 &
root@cloudtada:~# 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