Lệnh pgrep: tìm PID theo tên, tùy chọn -f và khác biệt giữa pidof và pkill
Để tìm số hiệu (PID) của tiến trình đang chạy theo tên, tài khoản hoặc dòng lệnh, hãy dùng lệnh pgrep. Trên máy chủ AlmaLinux 9, chúng tôi sao chép chương trình sleep với tên khác, chạy ba tiến trình rồi so sánh các tiến trình mà từng tùy chọn tìm thấy. Khi tìm theo tên chỉ có ba tiến trình đó, còn khi tìm trong toàn bộ dòng lệnh bằng -f thì cả timeout đã khởi chạy chúng cũng xuất hiện.
Kết quả bên dưới được chạy bằng tài khoản root trên máy chủ AlmaLinux 9.8 và một tài khoản thường trên máy chủ Debian 12. Đối tượng cần tìm là các bản sao của sleep mang tên pgdemo-a và pgdemo-b, được chạy bằng timeout 300 để tự kết thúc sau 5 phút. Số hiệu tiến trình (PID) và tên tài khoản Debian (user1) đã được thay bằng giá trị ví dụ, còn phiên bản procps-ng trên máy chủ AlmaLinux chỉ ghi đến phiên bản chính và phụ.
1️⃣ Cách dùng cơ bản lệnh pgrep
Nếu viết một phần tên sau pgrep, lệnh sẽ in số hiệu của các tiến trình có tên chứa các ký tự đó, mỗi dòng một số. Khi tìm pgdemo, có ba số hiệu: hai pgdemo-a và một pgdemo-b.
pgrep pgdemo2143
2152
2155Khi viết tên đến pgdemo-a thì chỉ còn lại hai pgdemo-a.
pgrep pgdemo-a2143
2152Chuỗi tìm kiếm được đọc như biểu thức chính quy mở rộng, và nếu không có tùy chọn thì chỉ tìm trong tên tiến trình.
Nếu không có tiến trình nào khớp, pgrep kết thúc mà không in gì, vì vậy hãy kiểm tra kết quả bằng mã thoát. Sau khi tìm tên không tồn tại pgdemo-zz, chạy [echo $?] cho ra 1.
pgrep pgdemo-zzecho $?1Khi chạy mà không ghi điều kiện nào, lỗi bên dưới xuất hiện cùng mã thoát 2. Trang man mô tả các mã thoát là 0 (tìm thấy), 1 (không tìm thấy), 2 (lỗi cú pháp dòng lệnh) và 3 (lỗi nghiêm trọng như thiếu bộ nhớ).
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2Nếu dùng mã thoát này làm điều kiện thay cho kết quả in ra, script có thể kiểm tra một tiến trình có đang chạy hay không. Phiên bản được kiểm tra bằng [pgrep -V]. Máy chủ Debian 12 dùng procps-ng 4.0.2, còn máy chủ AlmaLinux 9.8 dùng procps-ng 3.3.
pgrep -Vpgrep from procps-ng 4.0.22️⃣ Tùy chọn pgrep -f và kết quả của -l, -a
Chỉ nhìn số hiệu thì không biết đó là tiến trình nào, vì vậy hãy in kèm tên bằng -l hoặc toàn bộ dòng lệnh bằng -a.
pgrep -l pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300300 và 301 ở cuối kết quả của -a là đối số tính bằng giây truyền cho sleep. Chúng tôi phân biệt hai pgdemo-a cùng tên bằng các đối số này.
Khi thêm -f, pgrep tìm trong toàn bộ dòng lệnh thay vì trong tên. Khi tìm pgdemo-a bằng -f, số hiệu tăng từ hai lên bốn.
pgrep -f pgdemo-a2141
2143
2150
2152Thêm cả -a thì thấy hai dòng tăng thêm là các timeout nhận pgdemo-a làm đối số. Tên của chúng là timeout, nhưng dòng lệnh có chứa pgdemo-a nên khớp với điều kiện -f.
pgrep -af pgdemo-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301Khi dùng -f trong script, hãy kiểm tra xem chính script đó có xuất hiện trong kết quả không. pgrep không bao giờ đưa chính nó vào kết quả, nhưng nếu dòng lệnh của script đã chạy pgrep chứa chuỗi tìm kiếm thì script đó cũng xuất hiện.
Khi tìm pgdemo-a bằng chk.sh, một script truyền nguyên văn chuỗi nhận được cho [pgrep -af], dòng cuối có thêm chính script đó: bash chk.sh pgdemo-a.
bash chk.sh pgdemo-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-aMẫu [p]gdemo-a, đặt chữ cái đầu trong dấu ngoặc vuông, khi là biểu thức chính quy sẽ tìm cùng chuỗi với pgdemo-a, nhưng dòng lệnh của script ghi nguyên cả dấu ngoặc vuông nên không còn khớp. Khi truyền mẫu này cho cùng script, dòng của script biến mất và chỉ còn bốn dòng.
bash chk.sh '[p]gdemo-a'2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 3013️⃣ Các tùy chọn điều kiện của pgrep
Khi thêm -x, pgrep chỉ tìm các tiến trình có toàn bộ tên trùng khớp, không phải một phần. Với pgdemo không có kết quả nào, còn tìm pgdemo-a thì có hai.
pgrep -x pgdemopgrep -lx pgdemo-a2143 pgdemo-a
2152 pgdemo-a-u chọn tiến trình theo tài khoản đã chạy nó. Nếu ghi nhiều tài khoản cách nhau bằng dấu phẩy, lệnh tìm mọi tiến trình thuộc bất kỳ tài khoản nào trong số đó. Ba tiến trình chạy bằng root đều xuất hiện với [-u root], còn [-u daemon] không có tiến trình nào.
pgrep -u root -l pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3Khi ghi một tài khoản không tồn tại, lỗi [invalid user name] xuất hiện cùng mã thoát 2.
pgrep -u no-such-user9 pgdemopgrep: invalid user name: no-such-user9Trên tài khoản thường của máy chủ Debian 12, chúng tôi cũng tìm được một sleep do chính tài khoản đó chạy bằng cùng các tùy chọn.
pgrep -u user1 -l sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60Khi có nhiều tiến trình cùng tên, -n chỉ in tiến trình khởi động gần nhất, còn -o chỉ in tiến trình khởi động sớm nhất. Trong hai pgdemo-a chạy cách nhau 2 giây, -n chọn cái sau, -o chọn cái trước.
pgrep -n pgdemo-a2152pgrep -o pgdemo-a2143Trang man nói -n và -o không thể dùng cùng nhau. Khi ghi cả hai, chỉ có hướng dẫn sử dụng xuất hiện, không có thông báo lỗi.
-c in số lượng thay cho số hiệu. Nếu không tìm thấy gì, lệnh in 0 và mã thoát là 1.
pgrep -c pgdemo3pgrep -c pgdemo-zz0Tóm tắt các tùy chọn của pgrep như sau.
| Tùy chọn | Sao chép | Mô tả |
|---|---|---|
| -f--full | Tìm trong toàn bộ dòng lệnh thay vì trong tên | |
| -l--list-name | In tên kèm số hiệu | |
| -a--list-full | In toàn bộ dòng lệnh kèm số hiệu | |
| -x--exact | Chỉ tìm tiến trình có toàn bộ tên trùng khớp | |
| -u--euid | Chỉ tiến trình do tài khoản chỉ định chạy; ghi nhiều tài khoản cách nhau bằng dấu phẩy thì là bất kỳ tài khoản nào | |
| -n--newest | Tiến trình khởi động gần nhất trong số các tiến trình khớp | |
| -o--oldest | Tiến trình khởi động sớm nhất trong số các tiến trình khớp | |
| -c--count | In số lượng thay cho số hiệu; mã thoát 1 nếu là 0 | |
| -d--delimiter | Chỉ định ký tự phân cách giữa các số hiệu (mặc định là xuống dòng) | |
| -V--version | In phiên bản |
| Tùy chọn | Sao chép | Mô tả |
|---|---|---|
| -i--ignore-case | Tìm không phân biệt chữ hoa chữ thường | |
| -v--inverse | Tìm các tiến trình không khớp | |
| -P--parent | Chỉ các tiến trình con của số hiệu cha (PPID) chỉ định | |
| -t--terminal | Chỉ các tiến trình gắn với terminal chỉ định | |
| -g--pgroup | Chỉ các tiến trình thuộc số nhóm tiến trình chỉ định | |
| -s--session | Chỉ các tiến trình thuộc số phiên chỉ định | |
| -U--uid | Chỉ các tiến trình có cùng ID người dùng thực | |
| -G--group | Chỉ các tiến trình có cùng ID nhóm thực | |
| -w--lightweight | In tất cả số hiệu luồng thay cho số hiệu tiến trình |
🔲 Trình mô phỏng lệnh pgrep
Trình mô phỏng bên dưới bắt đầu với danh sách gồm sáu dòng pgdemo và timeout cùng các tiến trình ví dụ. Hãy chạm vào các chip để so sánh trong danh sách bên trái những dòng mà từng tùy chọn tìm thấy, và xem kết quả giảm đi với [pgrep -l pgdemo] sau [pkill pgdemo-b].
4️⃣ Khác biệt giữa pgrep, pidof và pkill
pidof chỉ tìm các tiến trình có toàn bộ tên chương trình trùng khớp, không dùng biểu thức chính quy, và in các số hiệu trên một dòng cách nhau bằng dấu cách. Khi tìm pgdemo-a, hai số hiệu xuất hiện trên một dòng, và 2152 khởi động sau đứng trước.
pidof pgdemo-a2152 2143Với phần tên pgdemo, khác với pgrep, pidof không tìm thấy gì và mã thoát là 1. Nếu chỉ cần một số hiệu, hãy thêm -s. [pidof -s pgdemo-a] chỉ in 2152.
pidof pgdemopidof -s pgdemo-a2152Để xem thời điểm bắt đầu và số hiệu cha (PPID) của các số hiệu tìm được, hãy nối chúng bằng dấu phẩy với pgrep -d rồi truyền cho -p của lệnh ps.
pgrep -d, pgdemo2143,2152,2155ps -fp $(pgrep -d, -x pgdemo-a)UID PID PPID C STIME TTY TIME CMD
root 2143 2141 0 15:59 ? 00:00:00 ./pgdemo-a 300
root 2152 2150 0 15:59 ? 00:00:00 ./pgdemo-a 3012141 và 2150 trong cột PPID là số hiệu của các timeout đã chạy hai pgdemo-a.
pkill tìm tiến trình theo cùng điều kiện với pgrep, nhưng gửi tín hiệu thay vì in số hiệu. Nếu không ghi tín hiệu, lệnh gửi SIGTERM, và có thể đổi tín hiệu như [pkill -HUP tên].
pkill gửi tín hiệu ngay khi tìm thấy, vì vậy hãy kiểm tra đối tượng trước bằng [pgrep -a] hoặc [pgrep -af] với cùng điều kiện. Khi tìm bằng -f, các timeout hoặc script có dòng lệnh chứa cùng chuỗi cũng trở thành đối tượng. Nếu đã biết số hiệu, hãy gửi tín hiệu chỉ đến số hiệu đó bằng lệnh kill.
| Lệnh | Tiêu chí tìm | Đầu ra | Chức năng |
|---|---|---|---|
| pgrep | Một phần tên (regex), với -f là toàn bộ dòng lệnh | Số hiệu; tên và dòng lệnh với -l, -a | Chỉ tìm |
| pidof | Toàn bộ tên chương trình | Số hiệu trên một dòng | Chỉ tìm |
| pkill | Cùng điều kiện với pgrep | Không có | Gửi tín hiệu đến tiến trình tìm thấy (mặc định SIGTERM) |
🔢 FAQ & nội dung đề xuất
Kiểm tra theo thời gian thực
Lệnh top trong Linux (kiểm tra mức dùng CPU và bộ nhớ)
Lệnh xem theo thời gian thực mỗi tiến trình dùng bao nhiêu CPU và bộ nhớ.
Tệp đang mở
[Linux] Lệnh lsof: in thông tin tệp đang được dùng
Lệnh xem các tệp mà một tiến trình đang mở, kèm PID.
Điều khiển tác vụ
Nền (Back Ground) và tiền cảnh (Fore Ground) trong Linux: điều khiển tiến trình
Cách điều khiển tác vụ để đưa lệnh xuống chạy nền rồi gọi lại lên tiền cảnh.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.