Cách tìm PID của tiến trình Linux bằng pidof hoặc pgrep

Tác giả sysadmin, T.Mười 20, 2023, 09:16:34 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Cách tìm PID của tiến trình Linux bằng pidof hoặc pgrep


Đặt một số vào một tên. Để tìm ID tiến trình của một tiến trình Linux, hãy sử dụng lệnh pidof, như sau: "pidof examplename". Nếu bạn chỉ biết một phần tên PID, thay vào đó bạn có thể sử dụng "pgrep examplenamefragment". Thay thế "examplename" và "examplenamefragment" bằng cụm từ bạn muốn tìm kiếm.

Làm việc với một tiến trình Linux thường có nghĩa là phải biết ID tiến trình hoặc PID của nó. Đó là một con số duy nhất được cấp cho mỗi phần mềm đang chạy. Dưới đây là hai cách để tìm ra nó là gì.

1. ID tiến trình Linux là gì?

Trong nội bộ, Linux theo dõi tiến trình đang chạy của nó bằng cách cấp cho chúng một số ID duy nhất, được gọi là ID tiến trình, hay PID. Mọi ứng dụng, tiện ích và daemon đang chạy đều có một PID.

PID là các giá trị số nguyên đơn giản. Một tiến trình mới được bắt đầu sẽ nhận được một PID cao hơn PID cuối cùng được cấp. Vì vậy, tiến trình có PID cao nhất là tiến trình mới nhất - tức là tiến trình được đưa ra gần đây nhất. Điều đó tiếp tục cho đến khi hệ thống đạt giá trị tối đa cho PID.

Giới hạn trên cho một PID là 32768. Khi đạt đến con số đó, Linux sẽ quay lại từ đầu và tìm kiếm một PID đã trở nên miễn phí vì quá trình sở hữu nó trước đó đã chấm dứt.

Quá trình có PID bằng 1 là quá trình đầu tiên được khởi chạy khi Linux được khởi chạy bởi quá trình khởi động. Trên các hệ thống dựa trên systemd sẽ có systemd. Trên các hệ thống khác, điều đó có thể xảy ra init, mặc dù một số bản phân phối Linux sử dụng các lựa chọn thay thế như OpenRc hoặc s6.

Đôi khi việc khám phá PID của một tiến trình là rất hữu ích, thường là do bạn muốn thực hiện một số hành động trên tiến trình đó. Đây là hai phương pháp khác nhau để tìm PID của một tiến trình khi bạn biết tên của tiến trình đó.

2. Cách nhận PID Linux bằng lệnh pidof

Lệnh pidofcó thể được coi là sự kết hợp của "PID" và "of." Nó giống như hỏi PID của quá trình này là gì? Nếu chúng ta sử dụng lệnh không có tham số thì nó sẽ không làm gì cả. Nó âm thầm đưa bạn trở lại dấu nhắc lệnh. Chúng ta cần chỉ định tên tiến trình.

Mã nguồn [Chọn]
bash pidof

pidof cho chúng ta biết PID của shell Bash là 8304. Chúng ta có thể xác minh điều đó bằng pslệnh. Tất cả những gì chúng ta cần làm là gọi psmà không có tham số. Nó sẽ báo cáo về các tiến trình đang chạy trong phiên hiện tại.

Mã nguồn [Chọn]
ps

Bởi vì ps báo cáo về tất cả các tiến trình mà nó có thể tìm thấy, bao gồm cả chính nó, nên nó cho chúng ta biết có một bashtiến trình và một pstiến trình đang chạy. Như chúng tôi mong đợi, bashtiến trình này có cùng một PID đã pidofđược báo cáo.

Nếu bạn mở nhiều cửa sổ terminal, pidof sẽ báo cáo tất cả.

Mã nguồn [Chọn]
bash pidof

Lưu ý rằng các PID được liệt kê từ cao nhất đến thấp nhất hay nói cách khác là từ gần đây nhất đến cũ nhất.

Điều này không thể hiện rằng bạn có thể không phải là chủ sở hữu của tất cả các tiến trình đó. pidoftìm tất cả các tiến trình có tên trùng khớp, bất kể ai sở hữu chúng. Hãy nhìn sâu hơn bằng cách chuyển đầu ra vào grep. Chúng tôi đang sử dụng tùy chọn -e(chọn tất cả tiến trình) và -f(danh sách đầy đủ) với ps.

Mã nguồn [Chọn]
ps -ef | bash grep

Hai trong số các tiến trình bash thuộc về người dùng dave, tiến trình thứ ba thuộc về người dùng mary.

Đôi khi một ứng dụng sẽ tạo ra nhiều tiến trình, mỗi tiến trình sẽ nhận được PID riêng. Đây là những gì chúng tôi nhận được với Google Chrome.

Mã nguồn [Chọn]
pidof chrome

Theo mặc định, pidof báo cáo về tất cả các tiến trình. Nếu muốn, chúng tôi có thể yêu cầu những tiến trình mới nhất trong số đó. Tùy chọn -s (một lần) thực hiện điều đó.

Mã nguồn [Chọn]
pidof -s chrome

Sử dụng kill lệnh để hủy tất cả chrome các tiến trình theo cách thủ công sẽ rất tẻ nhạt. Nếu chúng ta nắm bắt danh sách các tiến trình thành một biến, chúng ta có thể chuyển biến đó vào lệnh kill. Lệnh killcó thể chấp nhận nhiều PID trên lệnh của nó, vì vậy nó vui vẻ chấp nhận đầu vào của chúng tôi và loại bỏ tất cả các tiến trình đối với chúng tôi.

Mã nguồn [Chọn]
pid=$(pidof chrome)
Mã nguồn [Chọn]
echo $pid
Mã nguồn [Chọn]
kill $pid
Mã nguồn [Chọn]
pidof chrome

Lệnh đầu tiên thu thập đầu ra từ đó pidofvà gán nó cho biến mà chúng tôi đặt tên là pid. Chúng ta không cần đưa echonó lên màn hình, chúng ta chỉ làm điều đó để hiển thị giá trị của biến của chúng ta.

Chúng tôi chuyển biến cho kill lệnh, sau đó sử dụng pidofmột lần nữa để kiểm tra xem có còn tiến trình Chrome nào không. Tất cả họ đều đã bị giết.

Một điều khó hiểu pidoflà nó sẽ không trả về PID của tập lệnh shell. Nó trả về PID của bashshell đang chạy tập lệnh. Để xem shell đang chạy script, chúng ta cần sử dụng -x tùy chọn (scripts).

Mã nguồn [Chọn]
pidof -x sleep-loop.sh
Mã nguồn [Chọn]
ps -e | bash grep

pidof trả về PID của shell bash và pscho chúng ta thấy có hai shell đang chạy. Một là shell chạy pidof lệnh và cái còn lại là shell chạy tập lệnh.

3. Cách tìm PID bằng lệnh pgrep trong Linux

Lệnh này pgrephoạt động giống như pidoflấy ID tiến trình trong Linux. Tuy nhiên, nó không chỉ tìm thấy các tiến trình khớp chính xác với đầu mối tìm kiếm mà còn trả về PID của bất kỳ tiến trình nào có tên chứa văn bản tìm kiếm.

Đây là một ví dụ trên máy tính có Firefox chạy trên đó.

Mã nguồn [Chọn]
pgrep firefox
Mã nguồn [Chọn]
pgrep fire
Mã nguồn [Chọn]
pgrep fox
Mã nguồn [Chọn]
pgrep refo

Tất cả các lệnh này đều tìm tiến trình Firefox và trả về PID. Nhưng nếu bạn đã nhập lệnh:

Mã nguồn [Chọn]
pgrep refo
Về bản chất, làm sao bạn biết liệu pgrep đã tìm thấy Fi refo x chứ không phải một con quỷ tên là p refor md?

Nếu bạn thêm -l tùy chọn (tên danh sách), pgrep sẽ liệt kê tên tiến trình cùng với PID.

Mã nguồn [Chọn]
pgrep refo -l

Nếu có nhiều phiên bản của một tiến trình khớp, tất cả chúng đều được liệt kê.

Mã nguồn [Chọn]
bash pgrep

Lưu ý rằng chúng được liệt kê theo thứ tự tăng dần, thứ tự ngược lại với đầu ra từ pidof. Chúng được liệt kê từ tiến trình cũ nhất đến tiến trình mới nhất. Như chúng ta đã thấy với pidof, không phải tất cả các tiến trình được liệt kê đều thuộc về bạn.

Tùy -u chọn (id người dùng) cho phép bạn tìm kiếm các tiến trình khớp với văn bản tìm kiếm và được sở hữu bởi người dùng có tên.

Mã nguồn [Chọn]
pgrep bash -u dave

Lần này chúng ta thấy ba tiến trình bash trong kết quả. Cái còn lại đang được sử dụng bởi mary.

Mã nguồn [Chọn]
pgrep bash -u mary

Chúng ta có thể xâu chuỗi các tên người dùng lại với nhau dưới dạng danh sách được phân tách bằng dấu phẩy.

Mã nguồn [Chọn]
pgrep bash -u dave, mary -l

Và chúng tôi có thể yêu cầu xem tất cả các tiến trình cho một người dùng cụ thể.

Mã nguồn [Chọn]
pgrep -u dave -l

Để xem dòng lệnh đầy đủ, hãy sử dụng -atùy chọn (danh sách đầy đủ).

Mã nguồn [Chọn]
pgrep -u dave -a

4. Đôi lời về quyền sở hữu PID

Không phải tất cả các tiến trình hệ thống đều thuộc quyền sở hữu của người dùng root. Tất nhiên là có nhiều, nhưng không phải tất cả. Ví dụ: lệnh này hoạt động:

Mã nguồn [Chọn]
pgrep avahi-daemon
Nhưng lệnh này thất bại.

Mã nguồn [Chọn]
pgrep -u root avahi-daemon
Nó thất bại vì rootkhông sở hữu quá trình đó. Chủ sở hữu thực sự là người dùng hệ thống có tên "avahi". Sử dụng đúng tên người dùng, lệnh sẽ hoạt động.

Mã nguồn [Chọn]
pgrep -u avahi avahi-daemon
Đó là một chút vấn đề cần chú ý.