Câu hỏi Nếu tôi biết số PID của một quá trình, làm thế nào tôi có thể lấy tên của nó?


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

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


206
2017-08-17 07:12


gốc


Bạn có thể dùng ps hoặc là ls -l /proc/$PID/exe - Eddy_Em
@Eddy_Em sẽ cung cấp cho bạn tệp thi hành, không phải lúc nào cũng là tên quy trình. Ngoài ra, đó không phải là di động ... - derobert
ps -fp PID sẽ hiển thị lệnh đầy đủ - Temak


Các câu trả lời:


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 -o tùy chọn chỉ định định dạng đầu ra, comm có nghĩa là tên lệnh.

Xem thêm: ps - Các thông số kỹ thuật cơ bản của nhóm mở số 6


225
2017-08-17 08:21



comm dường như cắt ngắn lệnh thành 15 ký tự. Sử dụng command thay vào đó sửa nó. - Nemo
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm=  trong đó $ ps -p 1 -o command=  / sbin / init; có nghĩa là nó không phải là khoảng 15 ký tự, có thể chỉ là tên của nhị phân so với đường dẫn đầy đủ của nó. - OmarOthman
Thực ra, comm cung cấp tên nhị phân và command trả về đối số 0 - robbie0630


Bạn có thể tìm thấy tên quy trình hoặc lệnh được sử dụng bởi quá trình 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
Đối với 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 sử dụng có thể

# cat /proc/2480/cmdline 

 gnome-terminal

37
2017-08-17 08:04



Hãy cẩn thận: OP đề cập đến UNIX. Không phải tất cả UNIX đều thực hiện Kế hoạch 9 giống như tệp quá trình cụ thể. Câu trả lời của bạn thường chỉ áp dụng cho Linux. - slhck
Trong khi đó là sự thật, họ đã gắn thẻ câu hỏi "linux". Bất cứ ai đang sử dụng một hệ điều hành UNIX không dựa trên Linux sẽ được sử dụng khá nhiều để phải sửa đổi câu trả lời cho phù hợp với nhu cầu của họ - Andrew White


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

ps ax|egrep "^ [PID]"

cách khác bạn có thể sử dụng:

ps -a [PID]

enter image description here


12
2018-04-18 02:16



ps -a liệ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 lấy bất kỳ đầu vào nào. - Michael Lee
@MichaelLee Tôi đoán nó phụ thuộc vào ps phiên bản, bật procps version 3.2.7 hoạt động tốt. - Pedro Lobito


# 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

7
2018-05-06 00:14



Cái này hoàn hảo. - jayarjo
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 tin chuẩn. - Pablo Bianchi


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

6
2018-05-27 04:28



Lệnh này đã giúp tôi nhiều hơn mức cần thiết, tôi có toàn bộ quá trình bắt đầu. Cho một quá trình Java, với ps lệnh tất cả các bạn sẽ thấy chỉ là java, nhưng phần còn lại của thông số được truyền sẽ được hiển thị đầy đủ pmap. - Mincă Daniel Andrei


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 HEAD 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

3
2017-08-17 09:32



Điều này không ổn định vì nó cũng sẽ 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. Thử ps ax | grep 1 và xem liệu nó có thực sự trả về init quá 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
@slhck Đã sửa đổi câu trả lời ... cảm ơn 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 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} bởi vì nó là mặc định. Nhưng như bạn đã bình luận, -p là tốt hơn anyway. - dave_thompson_085


Simmilar để Câu trả lời của slhck, nhưng dựa vào các thao tác tệp thay vì lệnh gọi:

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

2
2017-08-30 23:31



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


Đá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à kết quả là 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 khi xem các lệnh đầy đủ mà ai đó đang chạy đang sử dụng 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.


2
2018-02-23 21:47



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


Tôi tìm thấy phương pháp dễ nhất với lệnh sau đây:

ps -awxs | grep pid

0
2017-11-21 09:48



Ngoài việc không hiệu quả cao so với ps -p${pid}, điều này sẽ nhận nhiều thông tin sai lệch - bao gồm cả grep chinh no. - Toby Speight