Nếu tôi biết số PID của một quá trình, làm thế nào tôi có thể nhận được tên của nó?


263

Nếu tôi có số PID cho một quy trình (trên máy UNIX), làm thế nào tôi có thể tìm ra tên của quy trình liên quan của nó?

Tôi phải làm gì đây?


9
Bạn có thể sử dụng pshoặcls -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em sẽ cung cấp cho bạn tệp thực thi, không phải luôn luôn là tên quy trình. Ngoài ra, đó không phải là di động ...
derobert

9
ps -fp PIDsẽ hiển thị toàn bộ lệnh
Temak

Câu trả lời:


284

Trên tất cả các hệ thống tuân thủ POSIX và với Linux, bạn có thể sử dụng ps:

ps -p 1337 -o comm=

Ở đây, quá trình được chọn bởi PID của nó với -p. Các -otùy chọn định dạng đầu ra, commcó nghĩa là tên lệnh.

Xem thêm: ps- Vấn đề thông số kỹ thuật cơ sở nhóm mở 6


28
comm dường như cắt ngắn lệnh thành 15 ký tự. Sử dụng commandthay vì sửa nó.
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; có nghĩa là nó không có khoảng 15 ký tự, có thể chỉ là tên nhị phân so với đường dẫn đầy đủ của nó.
OmarOthman

3
Trên thực tế, commđưa ra tên nhị phân và commandtrả về đối số 0
robbie

45

Bạn có thể tìm thấy tên tiến trình hoặc lệnh được sử dụng bởi id-id hoặc pid từ

/proc/pid/cmdline

bằng cách làm

cat /proc/pid/cmdline

Ở đây pid là pid mà bạn muốn tìm tên
For exmaple:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

Để tìm tên quy trình được sử dụng bởi pid 2480, bạn có thể sử dụng

# cat /proc/2480/cmdline 

 gnome-terminal

14
Hãy cẩn thận: OP đề cập đến UNIX. Không phải tất cả các UNIX đều thực hiện Kế hoạch 9 như tệp quy trình cụ thể. Câu trả lời của bạn thường chỉ áp dụng cho Linux.
slhck

3
Trong khi đó là sự thật, họ đã gắn thẻ câu hỏi "linux". Bất cứ ai đang sử dụng HĐH UNIX không dựa trên Linux sẽ khá quen với việc phải sửa đổi câu trả lời để phù hợp với nhu cầu của họ
Andrew White

14

Để có được đường dẫn của chương trình bằng một pid nào đó, bạn có thể sử dụng:

ps ax|egrep "^ [PID]"

Ngoài ra, bạn có thể sử dụng:

ps -a [PID]

nhập mô tả hình ảnh ở đây


1
ps -aliệt kê tất cả các quy trình được liên kết với thiết bị đầu cuối, nó không nhận bất kỳ đầu vào nào.
Michael Lee

@MichaelLee Tôi đoán nó phụ thuộc vào psphiên bản, procps version 3.2.7hoạt động tốt.
Pedro lobito

8
# ls -la /proc/ID_GOES_HERE/exe

Thí dụ:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop

Điều này là hoàn hảo.
jayarjo

1
Có lẽ tốt hơn : readlink /proc/1337/exe. readlink - in các liên kết tượng trưng được giải quyết hoặc tên tệp chính tắc.
Pablo A

8

Bạn có thể sử dụng pmap. Tôi đang tìm kiếm PID 6649. Và cắt bỏ các chi tiết quá trình bổ sung.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

Lệnh này đã giúp tôi nhiều hơn tôi cần, tôi có đầy đủ dòng quy trình bắt đầu. Đưa ra một quy trình Java, với pslệnh tất cả những gì bạn sẽ thấy chỉ là java, nhưng phần còn lại của các tham số được truyền sẽ được hiển thị đầy đủ với pmap.
Daniel Andrei Mincă

3

Bạn cũng có thể sử dụng awk kết hợp với ps

ps aux | awk '$2 == PID number for a process  { print $0 }'

thí dụ:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

để in LINE LINE bạn có thể sử dụng

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init

2
Điều này không ổn định vì nó cũng chọn các quy trình xảy ra để bao gồm số ở bất kỳ đâu trong lệnh của chúng. Hãy thử ps ax | grep 1và xem liệu nó thực sự trả về initquá trình, ví dụ. (Trong trường hợp của tôi, nó trả về 119 dòng không mong muốn.)
slhck

1
@slhck Đã sửa đổi câu trả lời ... cảm ơn vì thông tin .. ps -p 1 -o comm = là lựa chọn tốt nhất cho câu hỏi này.
Gangadhar

Chúng tôi không cần hai lần chạy để giữ lại các tiêu đề, thay vào đó hãy sử dụng ps aux | awk 'NR==1 || $2==PID'- và không cần phải nói {print $0}vì đó là mặc định. Nhưng như bạn nhận xét, -pdù sao thì tốt hơn.
dave_thndry_085

3

Tương tự như câu trả lời của slhck , nhưng dựa vào các thao tác tệp thay vì các lệnh:

MYPID=1
cat "/proc/$MYPID/comm"

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, không phải / sbin / init. Câu trả lời của ông có phiên bản dài hơn bao gồm. Nhưng dù sao +1.
OmarOthman

2

Đáng ngạc nhiên, không ai đã đề cập đến tùy chọn -f (lệnh đầy đủ) cho ps. Tôi thích sử dụng nó với -e (mọi thứ) và đưa kết quả vào grep để tôi có thể thu hẹp tìm kiếm của mình.

ps -ef | grep <PID>

Điều này cũng rất hữu ích để xem xét các lệnh đầy đủ mà ai đó đang chạy đang chiếm nhiều tài nguyên trên hệ thống của bạn. Điều này sẽ cho bạn thấy các tùy chọn và đối số được truyền cho lệnh.


3
Không hoạt động trên BSD (có thể bao gồm MacOSX? Tôi không chắc chắn). Ngay cả khi -e -fcó sẵn, grepcó thể tạo ra nhiều kết quả khớp sai, ví dụ như grep 33pid = 933 hoặc 339, ppid = 33 hoặc 933 hoặc 339, thời gian sử dụng là 33 giây hoặc 33 phút hoặc tên chương trình hoặc đối số có chứa 33 - bao gồm cả grepchính nó. Tất cả (AFAIK) psđều có -p, vì vậy chỉ cần ps -fp 33.
dave_thndry_085

0

Tôi tìm thấy phương pháp đơn giản nhất với lệnh sau:

ps -awxs | grep pid

Ngoài việc không hiệu quả cao so với ps -p${pid}, điều này sẽ nhận được rất nhiều tích cực sai - bao gồm cả grepchính nó.
Toby Speight

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.