Lệnh pgrep: tìm PID theo tên, tùy chọn -f và khác biệt giữa pidof và pkill

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8procps-ng 3.3Tài khoản rootDebian 12 · procps-ng 4.0.2 tài khoản thường
Lệnh tiến trình · lập lịch tác vụpgrep, pidofVị trí/usr/bin/pgrep

Để 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

  • ↪️ Tìm PID theo tên và mã thoát

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 pgdemo
2143
2152
2155

Khi viết tên đến pgdemo-a thì chỉ còn lại hai pgdemo-a.

pgrep pgdemo-a
2143
2152

Chuỗ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-zz
echo $?
1

Khi 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ớ).

pgrep
pgrep: no matching criteria specified
Try `pgrep --help' for more information.
echo $?
2

Nế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 -V
pgrep from procps-ng 4.0.2

2️⃣ Tùy chọn pgrep -f và kết quả của -l, -a

  • ↪️ Các tiến trình cùng xuất hiện khi tìm trong toàn bộ dòng lệnh

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 pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -a pgdemo
2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300

300 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-a
2141
2143
2150
2152

Thê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-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

Khi 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-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-a

Mẫ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 301

3️⃣ Các tùy chọn điều kiện của pgrep

  • ↪️ -u tài khoản, -x tên chính xác, -n và -o, -c số lượng

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 pgdemo
pgrep -lx pgdemo-a
2143 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 pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -u daemon -l pgdemo
pgrep -u root,daemon -c pgdemo
3

Khi 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 pgdemo
pgrep: invalid user name: no-such-user9

Trê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 sleep
3047 sleep
pgrep -u user1 -a sleep
3047 sleep 60

Khi 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-a
2152
pgrep -o pgdemo-a
2143

Trang 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 pgdemo
3
pgrep -c pgdemo-zz
0

Tóm tắt các tùy chọn của pgrep như sau.

Tùy chọnSao chépMô tả
-f--fullTìm trong toàn bộ dòng lệnh thay vì trong tên
-l--list-nameIn tên kèm số hiệu
-a--list-fullIn toàn bộ dòng lệnh kèm số hiệu
-x--exactChỉ tìm tiến trình có toàn bộ tên trùng khớp
-u--euidChỉ 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--newestTiến trình khởi động gần nhất trong số các tiến trình khớp
-o--oldestTiến trình khởi động sớm nhất trong số các tiến trình khớp
-c--countIn số lượng thay cho số hiệu; mã thoát 1 nếu là 0
-d--delimiterChỉ định ký tự phân cách giữa các số hiệu (mặc định là xuống dòng)
-V--versionIn phiên bản
Tùy chọnSao chépMô tả
-i--ignore-caseTìm không phân biệt chữ hoa chữ thường
-v--inverseTìm các tiến trình không khớp
-P--parentChỉ các tiến trình con của số hiệu cha (PPID) chỉ định
-t--terminalChỉ các tiến trình gắn với terminal chỉ định
-g--pgroupChỉ các tiến trình thuộc số nhóm tiến trình chỉ định
-s--sessionChỉ các tiến trình thuộc số phiên chỉ định
-U--uidChỉ các tiến trình có cùng ID người dùng thực
-G--groupChỉ các tiến trình có cùng ID nhóm thực
-w--lightweightIn 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].

Trình mô phỏng lệnh pgrepprocps-ng 3.3
[root@server work]#
Chỉ chạy trong trình duyệt. Danh sách bên trái là giá trị ví dụ, và [Just matched] được gắn cạnh các dòng mà pgrep tìm thấy. [pkill] chỉ mô phỏng bằng cách xóa dòng khỏi danh sách.

4️⃣ Khác biệt giữa pgrep, pidof và pkill

  • ↪️ pidof tìm đúng tên, pkill gửi tín hiệu

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-a
2152 2143

Vớ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 pgdemo
pidof -s pgdemo-a
2152

Để 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, pgdemo
2143,2152,2155
ps -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 301

2141 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ệnhTiêu chí tìmĐầu raChức năng
pgrepMột phần tên (regex), với -f là toàn bộ dòng lệnhSố hiệu; tên và dòng lệnh với -l, -aChỉ tìm
pidofToàn bộ tên chương trìnhSố hiệu trên một dòngChỉ tìm
pkillCùng điều kiện với pgrepKhô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

pgrep chỉ so sánh tên tiến trình đến 15 ký tự được lưu trong /proc/PID/stat. Nếu tên dài hơn 15 ký tự, hãy tìm bằng 15 ký tự đầu hoặc dùng -f để tìm trong toàn bộ dòng lệnh ở /proc/PID/cmdline.

Khi lọc danh sách ps bằng grep, dòng lệnh của grep đó cũng chứa tên cần tìm nên có thể xuất hiện trong kết quả. pgrep không đưa chính nó vào kết quả và chỉ in số hiệu, nên dễ truyền cho lệnh khác.

Khi thêm -v, pgrep đảo điều kiện và tìm các tiến trình không khớp. Trong pkill, không thể dùng tùy chọn ngắn -v để tránh nhầm lẫn.

ℹ️ 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á.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 5   +   3   =