Thursday, November 21, 2024

How to Kill a Process in Linux?

-

Trước khi kill tiến trình chúng ta cần phải xác định ID của tiến trình cần kill bằng các sử dụng một số lệnh như top, ps,…

1. Xác định ID.

1.1. Sử dụng lệnh top

Lệnh top là một công cụ hỗ trợ theo dõi hoạt động của hệ thống Linux. Nó cho phép xem danh sách các tiến trình đang chạy trên hệ thống, tài nguyên mà các tiến trình đang sử dụng, và thông tin thống kê về hệ thống.

Khi chạy lệnh top, danh sách các tiến trình sẽ được hiển thị trong một bảng. Các tiến trình này được sắp xếp theo mức độ sử dụng tài nguyên, với các tiến trình sử dụng nhiều tài nguyên ở đầu bảng.

Bạn có thể sử dụng các phím điều khiển để tương tác với top, bao gồm:

  • k để tắt một tiến trình
  • r để thay đổi ưu tiên của một tiến trình
  • q để thoát khỏi top

Với lệnh top, bạn có thể tìm kiếm một tiến trình cụ thể bằng cách sử dụng các tùy chọn như -p để chỉ định ID của tiến trình, hoặc -U để chỉ định tên người dùng của tiến trình. Các tùy chọn này sẽ giúp bạn tìm ra các tiến trình đang chạy trên hệ thống một cách dễ dàng.

Một số tùy chọn phổ biến trong lệnh top:

  • -d <seconds>: Thiết lập thời gian cập nhật của top. Mặc định là 3 giây.
  • -p <pid(s)>: Chỉ hiển thị thông tin của quá trình được chỉ định bởi số PID.
  • -u <username>: Chỉ hiển thị thông tin của quá trình được thực hiện bởi người dùng được chỉ định.
  • -C: Không hiển thị trường dữ liệu %CPU và %MEM.
  • -H: Hiển thị các quá trình con trong cùng một cột với quá trình cha của nó.
  • -M: Sử dụng đơn vị Megabytes cho các trường dữ liệu về bộ nhớ.
  • q: Thoát khỏi top.

Các tùy chọn khác cũng có sẵn, bạn có thể xem tất cả bằng cách chạy lệnh man top.

Ví dụ lệnh top -c

top - 03:38:48 up 20:00,  1 user,  load average: 0.19, 0.19, 0.19
Tasks: 130 total,   1 running,  69 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.7 us,  0.8 sy,  0.0 ni, 96.3 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8167420 total,  2935908 free,   347212 used,  4884300 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  7540872 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                              
12057 hoanghd   20   0   44684   4096   3400 R   5.9  0.1   0:00.02 top -c                                                                                                                                               
    1 root      20   0  159912   9048   6528 S   0.0  0.1   1:07.39 /sbin/init                                                                                                                                           
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.07 [kthreadd]                                                                                                                                           
    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 [kworker/0:0H]                                                                                                                                       
    6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 [mm_percpu_wq]                                                                                                                                       
    7 root      20   0       0      0      0 S   0.0  0.0   0:01.61 [ksoftirqd/0]                                                                                                                                        
    8 root      20   0       0      0      0 I   0.0  0.0   0:30.90 [rcu_sched]                                                                                                                                          
    9 root      20   0       0      0      0 I   0.0  0.0   0:00.00 [rcu_bh]                                                                                                                                             
   10 root      rt   0       0      0      0 S   0.0  0.0   0:00.23 [migration/0]                                                                                                                                        
   11 root      rt   0       0      0      0 S   0.0  0.0   0:00.20 [watchdog/0]                                                                                                                                         
   12 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [cpuhp/0]                                                                                                                                            
   13 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [cpuhp/1]                                                                                                                                            
   14 root      rt   0       0      0      0 S   0.0  0.0   0:00.19 [watchdog/1]                                                                                                                                         
   15 root      rt   0       0      0      0 S   0.0  0.0   0:00.23 [migration/1]                                                                                                                                        
   16 root      20   0       0      0      0 S   0.0  0.0   0:01.61 [ksoftirqd/1]                                                                                                                                        
   18 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 [kworker/1:0H]                                                                                                                                       
   19 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [cpuhp/2]                                                                                                                                            
   20 root      rt   0       0      0      0 S   0.0  0.0   0:00.20 [watchdog/2]                                                                                                                                         
   21 root      rt   0       0      0      0 S   0.0  0.0   0:00.22 [migration/2]                                                                                                                                        
   22 root      20   0       0      0      0 S   0.0  0.0   0:01.77 [ksoftirqd/2]                                                                                                                                        
   24 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 [kworker/2:0H]                                                                                                                                                                                         

1.2. Sử dụng lệnh ps và grep

Lệnh ps trong Linux được sử dụng để hiển thị thông tin về các tiến trình đang chạy trong hệ thống. Lệnh grep dùng để tìm kiếm một chuỗi ký tự cụ thể trong một file hoặc đầu ra được truyền vào từ một lệnh khác.

Lệnh ps (Process Status) được sử dụng để hiển thị trạng thái của các tiến trình đang chạy trên hệ thống Linux. Dưới đây là một số tùy chọn phổ biến trong lệnh ps:

  • ps aux: Hiển thị tất cả các tiến trình đang chạy trên hệ thống (bao gồm cả tiến trình của các người dùng khác) với đầy đủ thông tin, bao gồm cả ID của tiến trình (PID), % CPU, % memory và thời gian chạy.
  • ps -ef: Hiển thị tất cả các tiến trình đang chạy trên hệ thống (không bao gồm các tiến trình của người dùng khác) với đầy đủ thông tin, bao gồm cả PID, PPID (Parent Process ID), % CPU, % memory và thời gian chạy.
  • ps -e: Hiển thị tất cả các tiến trình đang chạy trên hệ thống với đầy đủ thông tin, không bao gồm % CPU, % memory và thời gian chạy.
  • ps -f: Hiển thị tất cả các tiến trình đang chạy trên hệ thống với đầy đủ thông tin, bao gồm cả PID, PPID, % CPU, % memory và thời gian chạy.
  • ps -l: Hiển thị tất cả các tiến trình đang chạy trên hệ thống với đầy đủ thông tin, bao gồm cả PID, PPID, USER (người dùng chạy tiến trình), % CPU, % memory và thời gian chạy.
  • ps -o: Hiển thị các trường được chỉ định, ví dụ: ps -o pid,ppid,cmd,%cpu,%mem.
  • ps -p: Hiển thị thông tin của một tiến trình cụ thể, ví dụ: ps -p 1234 (1234 là PID của tiến trình cần xem thông tin).
  • ps -u: Hiển thị thông tin của tất cả các tiến trình của một người dùng cụ thể, ví dụ: ps -u root.

Để tìm kiếm một tiến trình đang chạy bằng psgrep, ta sử dụng cú pháp sau:

ps aux | grep process_name

Ở đây, process_name là tên của tiến trình cần tìm kiếm. Ví dụ, để tìm kiếm tiến trình nginx, ta có thể sử dụng lệnh:

ps aux | grep nginx

Lệnh này sẽ hiển thị thông tin về tất cả các tiến trình đang chạy có chứa chuỗi “nginx”.

Thông thường, kết quả trả về sẽ bao gồm tên người dùng, ID tiến trình (PID), thời gian chạy, và nhiều thông tin khác về các tiến trình. Ta có thể sử dụng các tùy chọn của ps để hiển thị các thông tin cụ thể về các tiến trình.

Lưu ý rằng, khi sử dụng psgrep để tìm kiếm tiến trình, ta cần biết chính xác tên của tiến trình đó. Nếu ta không biết chính xác tên tiến trình, ta có thể sử dụng top để hiển thị danh sách các tiến trình đang chạy và tìm kiếm thông tin cần thiết.

1.3. Sử dụng lệnh pidofpgrep

pidofpgrep là hai lệnh khác trong Linux, được sử dụng để tìm kiếm các tiến trình đang chạy trong hệ thống.

  • pidof: Lệnh pidof trả về PID của tiến trình dựa trên tên của tiến trình đó. Nếu có nhiều tiến trình cùng tên, pidof sẽ trả về tất cả các PID của các tiến trình đó.

Lệnh pidof không có nhiều tùy chọn, chỉ có một vài tùy chọn cơ bản sau đây:

  • -s: Tìm kiếm các tiến trình con của quá trình có PID được chỉ định.
  • -c: Chỉ đếm số tiến trình được tìm thấy thay vì hiển thị danh sách các PID.

Ví dụ, để tìm kiếm PID của tiến trình nginx, ta có thể sử dụng lệnh:

pidof nginx

Lệnh này sẽ trả về một danh sách các PID của tất cả các tiến trình nginx đang chạy trên hệ thống.

  • pgrep: pgrep cũng tìm kiếm các tiến trình dựa trên tên tiến trình, tuy nhiên nó trả về PID của tiến trình duy nhất đầu tiên tìm thấy. Điều này có nghĩa là nó chỉ trả về một PID duy nhất thay vì danh sách các PID.

Ví dụ, để tìm kiếm PID của tiến trình nginx, ta có thể sử dụng lệnh:

pgrep nginx

Lệnh này sẽ trả về PID của tiến trình nginx đầu tiên tìm thấy trên hệ thống.

Cả pidofpgrep đều hữu ích để sử dụng trong các script hoặc khi bạn muốn tìm kiếm các tiến trình đang chạy trong hệ thống một cách nhanh chóng và thuận tiện.

2. Kill tiến trình.

Để giết một tiến trình, chúng ta cần biết những tiến trình nào có thể bị giết trước. Dưới đây là một số điểm cần thiết về việc giết tiến trình:

  • Nếu bạn là người dùng bình thường, bạn chỉ có thể giết các tiến trình thuộc về bạn. Bạn không thể giết các tiến trình đang chạy bởi người dùng khác. Lệnh top và ps aux hiển thị người dùng với các tiến trình liên quan.
  • Người dùng root có thể giết tất cả các tiến trình. Tuy nhiên, chúng ta cũng có thể thêm sudo trước bất kỳ lệnh nào để thực thi nó dưới dạng root.
  • Trong Linux, khi một tiến trình đang bị giết, một tín hiệu đặc biệt được truyền đến các tiến trình. Mặc dù có nhiều loại tín hiệu trong Linux, nhưng trong trường hợp này, Linux xử lý các tín hiệu SIGKILLS và SIGTERM. Theo mặc định, Linux gửi SIGTERM, giải phóng tiến trình một cách lịch sự. Nếu bạn muốn giết một tiến trình một cách mạnh mẽ, hãy sử dụng SIGKILL thay vào đó.
  • Linux giữ trạng thái của các tiến trình cho đến khi nó được hoàn toàn loại bỏ khỏi hệ thống. Vì vậy, các tiến trình con sẽ được hiển thị trong danh sách tiến trình cho đến khi tiến trình cha bị xóa.
  • Chúng ta không thể giết một tiến trình nếu nó đang ở trạng thái ‘uninterruptible sleep.’ Tình trạng này xảy ra khi một tiến trình thực hiện một thao tác input/output. Tình trạng này có thể được nhìn thấy trong cột 8 của lệnh top và ps aux.

2.1. Sử dụng lệnh kill

Cú pháp:

kill -SIGNAL PID  

Trong hệ điều hành Linux và các hệ thống tương tự, các tiến trình có thể giao tiếp với nhau hoặc với hệ thống bằng cách gửi các tín hiệu. Các tín hiệu này được định danh bằng tên và số hiệu khác nhau. Dưới đây là một số tín hiệu phổ biến và ý nghĩa của chúng:

  • SIGNULL (số hiệu 0): tín hiệu rỗng, được sử dụng để kiểm tra quyền truy cập vào PID.
  • SIGHUP (số hiệu 1): tín hiệu kết nối bị ngắt, được sử dụng để thông báo cho tiến trình rằng terminal kết nối với nó đã bị ngắt.
  • SIGINT (số hiệu 2): tín hiệu bị gián đoạn, được gửi khi người dùng ấn Ctrl+C để kết thúc tiến trình đang chạy.
  • SIGQUIT (số hiệu 3): tín hiệu thoát, được sử dụng để yêu cầu tiến trình kết thúc và cung cấp thông tin gỡ lỗi chi tiết.
  • SIGKILL (số hiệu 9): tín hiệu giết, được sử dụng để giết một tiến trình ngay lập tức mà không cần phải đợi cho tiến trình xử lý hoàn tất.
  • SIGTERM (số hiệu 15): tín hiệu kết thúc, được sử dụng để yêu cầu tiến trình kết thúc một cách an toàn, cho phép tiến trình hoàn thành các hoạt động cuối cùng trước khi thoát.
  • SIGSTOP (số hiệu 24): tín hiệu dừng, được sử dụng để dừng một tiến trình đang chạy.
  • SIGTSTP (số hiệu 25): tín hiệu tạm dừng, được sử dụng để tạm dừng một tiến trình và đưa nó vào chế độ ngủ.
  • SIGCONT (số hiệu 26): tín hiệu tiếp tục, được sử dụng để tiếp tục chạy một tiến trình đã bị tạm dừng trước đó bằng tín hiệu SIGSTOP hoặc SIGTSTP.

Lệnh kill -l được sử dụng để liệt kê tất cả các tín hiệu (signal) mà hệ thống hỗ trợ. Tín hiệu là các thông điệp được sử dụng để gửi cho một tiến trình hoặc một nhóm tiến trình để yêu cầu chúng thực hiện một hành động cụ thể như tạm dừng, tiếp tục, kết thúc, hoặc khởi động lại.

hoanghd@cicd:~$ 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

Khi sử dụng kill -l, danh sách tín hiệu sẽ được hiển thị, bao gồm tên tín hiệu, số tín hiệu tương ứng và mô tả ngắn gọn về mục đích của tín hiệu đó. Thông thường, các tín hiệu phổ biến được sử dụng để quản lý tiến trình là SIGKILL, SIGTERM, SIGINT, SIGSTOP, SIGCONT, …

Cú pháp cơ bản của lệnh kill là:

kill [options] [PID]

Trong đó, PID là số hiệu quá trình (process ID) mà bạn muốn kết thúc. Bạn có thể tìm PID của một quá trình bằng lệnh ps.

Các tùy chọn thường được sử dụng trong lệnh kill bao gồm:

  • -9 (hoặc -KILL): kết thúc quá trình một cách bắt buộc, không cho phép quá trình kết thúc bình thường.
  • -15 (hoặc -TERM): yêu cầu quá trình kết thúc một cách an toàn, cho phép quá trình kết thúc các tác vụ cần thiết trước khi kết thúc.

Ví dụ 1:

Để kết thúc một quá trình có PID là 1234, bạn có thể sử dụng lệnh kill 1234. Nếu quá trình không kết thúc, bạn có thể sử dụng tùy chọn -9 để bắt buộc kết thúc nó, ví dụ: kill -9 1234.

Ví dụ 2:

kill -9 2408

Lệnh này được sử dụng để tắt một tiến trình có ID quy trình (PID) là 2408 trên hệ thống Linux. Tùy chọn “-9” được sử dụng để gửi tín hiệu SIGKILL đến tiến trình, giúp kết thúc tiến trình một cách ngay lập tức. Cần lưu ý rằng việc sử dụng tín hiệu SIGKILL sẽ không cho phép tiến trình được tắt một cách đúng đắn, nó sẽ bị dừng ngay lập tức mà không có cơ hội để lưu dữ liệu hoặc hoàn thành các tác vụ cần thiết trước khi kết thúc. Do đó, tín hiệu SIGTERM (tùy chọn “-15”) thường được ưu tiên sử dụng để kết thúc tiến trình một cách đúng đắn.

2.2. Sử dụng killall

Trong Linux, killall là một lệnh dùng để kết thúc một hoặc nhiều tiến trình đang chạy bằng tên của chúng. Tên tiến trình có thể được định nghĩa là tên của chương trình hoặc quá trình con được bắt đầu bởi một tiến trình cha.

Khi sử dụng lệnh killall, chúng ta cần chỉ định tên của tiến trình cần kết thúc. Nếu không chỉ định bất kỳ tùy chọn nào khác, tiến trình đầu tiên được tìm thấy với tên đã cho sẽ bị kết thúc. Nếu có nhiều tiến trình cần kết thúc, ta có thể sử dụng tùy chọn -I hoặc --interactive để yêu cầu xác nhận trước khi kết thúc từng tiến trình.

Ngoài ra, ta cũng có thể sử dụng tùy chọn -u hoặc --user để chỉ định người dùng của các tiến trình cần kết thúc. Nếu không có tùy chọn này, killall sẽ kết thúc tất cả các tiến trình có tên đã chỉ định cho tất cả các người dùng.

Lưu ý rằng killall có thể gây ra mất mát dữ liệu nếu ta kết thúc các tiến trình đang chạy. Ta nên cẩn thận khi sử dụng lệnh này và kiểm tra kỹ trước khi kết thúc bất kỳ tiến trình nào.

Ví dụ: Giả sử bạn muốn tắt tất cả các tiến trình Firefox đang chạy trên hệ thống của bạn, bạn có thể sử dụng lệnh sau:

killall firefox

Lệnh này sẽ tìm và tắt tất cả các tiến trình có tên “firefox”. Nếu có nhiều hơn một tiến trình với tên này đang chạy, tất cả chúng đều sẽ bị tắt. Lưu ý rằng việc này có thể gây mất dữ liệu nếu bạn đang làm việc trên các tab hoặc trang web chưa lưu lại.

Lệnh killall được sử dụng để kết thúc các tiến trình bằng tên tiến trình. Nó sẽ tìm kiếm và kết thúc tất cả các tiến trình có tên trùng khớp với tên của tiến trình được chỉ định.

Trong ví dụ này, chúng ta sử dụng lệnh killall để kết thúc một tiến trình đang chạy ít hơn 20 phút. Tham số -y được sử dụng để xác định thời gian tối đa mà tiến trình được chạy trước khi bị kết thúc. Thời gian được chỉ định theo định dạng “m” đại diện cho phút.

Ví dụ: Nếu bạn muốn kết thúc tất cả các tiến trình Chrome đã chạy trong 20 phút, bạn có thể sử dụng lệnh sau:

killall -y 20m chrome

Lệnh này sẽ kết thúc tất cả các tiến trình Chrome đã chạy trong 20 phút.

2.3. Sử dụng lệnh pkill

Lệnh pkill trong Linux được sử dụng để tìm kiếm và kết thúc (kill) các tiến trình (process) dựa trên tên của chúng. Nó là một cách khác để tìm và kết thúc một tiến trình nhanh chóng, tương tự như lệnh killall.

Khác với killall là kết thúc các tiến trình bằng cách tìm kiếm theo tên, pkill cho phép bạn tìm kiếm và kết thúc các tiến trình dựa trên tên của chúng hoặc các thuộc tính khác như user, pid, uid, gid, và nhiều thuộc tính khác.

Ví dụ: để kết thúc một tiến trình có tên là “firefox”, bạn có thể sử dụng lệnh pkill firefox. Hoặc để kết thúc tất cả các tiến trình có tên bắt đầu bằng “chrome”, bạn có thể sử dụng lệnh pkill -f chrome.

Previous article
Next article

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories