ถ้าฉันรู้หมายเลข PID ของกระบวนการฉันจะได้รับชื่อได้อย่างไร


263

หากฉันมีหมายเลข PID สำหรับกระบวนการ (บนเครื่อง UNIX) ฉันจะทราบชื่อกระบวนการที่เกี่ยวข้องได้อย่างไร

ฉันต้องทำอะไร?


9
คุณสามารถใช้psหรือls -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em ที่จะให้ไฟล์ปฏิบัติการแก่คุณซึ่งไม่ได้เป็นชื่อกระบวนการเสมอไป นอกจากนี้ยังไม่สามารถพกพาได้ ...
Derobert

9
ps -fp PIDจะแสดงคำสั่งทั้งหมด
Temak

คำตอบ:


284

บนระบบที่สอดคล้องกับ POSIX ทั้งหมดและด้วย Linux คุณสามารถใช้ps:

ps -p 1337 -o comm=

นี่คือกระบวนการที่จะถูกเลือกโดย PID -pด้วย -oตัวเลือกที่กำหนดรูปแบบการส่งออกcommความหมายชื่อคำสั่ง

ดูเพิ่มเติมที่: ps- ข้อมูลจำเพาะของ Open Group Base ฉบับที่ 6


28
comm ดูเหมือนจะตัดคำสั่งเหลือ 15 ตัวอักษร ใช้commandแทนแก้ไขมัน
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; ซึ่งหมายความว่ามันไม่ได้ประมาณ 15 ตัวอักษรอาจเป็นเพียงชื่อของไบนารีกับเส้นทางแบบเต็มของมัน
OmarOthman

3
ที่จริงแล้วcommให้ชื่อของไบนารีและcommandส่งกลับข้อโต้แย้ง 0
robbie

45

คุณสามารถค้นหาชื่อกระบวนการหรือคำสั่งที่ใช้โดย process-id หรือ pid จาก

/proc/pid/cmdline

จากการทำ

cat /proc/pid/cmdline

pid นี่คือ pid ที่คุณต้องการค้นหาชื่อ
exmaple:

 # ps aux

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

ในการค้นหาชื่อกระบวนการที่ใช้โดย pid 2480 คุณสามารถใช้

# cat /proc/2480/cmdline 

 gnome-terminal

14
ระวัง: OP กล่าวถึง UNIX UNIX บางตัวใช้แผน 9 เช่นไฟล์เฉพาะกระบวนการ คำตอบของคุณโดยทั่วไปจะใช้กับ Linux เท่านั้น
slhck

3
ในขณะที่เป็นจริงพวกเขาติดแท็กคำถาม "linux" ทุกคนที่ใช้ระบบปฏิบัติการ UNIX ที่ไม่ใช่ Linux จะค่อนข้างคุ้นเคยกับการปรับเปลี่ยนคำตอบเพื่อให้เหมาะกับความต้องการของพวกเขา
Andrew White

14

ในการรับเส้นทางของโปรแกรมโดยใช้ pid คุณสามารถใช้:

ps ax|egrep "^ [PID]"

หรือคุณสามารถใช้:

ps -a [PID]

ป้อนคำอธิบายรูปภาพที่นี่


1
ps -aแสดงกระบวนการทั้งหมดที่เชื่อมโยงกับเทอร์มินัลโดยไม่รับข้อมูลใด ๆ
Michael Lee

@MichaelLee ผมคิดว่ามัน depenends ในpsรุ่นในprocps version 3.2.7ผลงานที่ดี
Pedro Lobito

8
# ls -la /proc/ID_GOES_HERE/exe

ตัวอย่าง:

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

อันนี้สมบูรณ์แบบ
jayarjo

1
น่าจะดีกว่า: readlink /proc/1337/exe. readlink - พิมพ์ลิงก์สัญลักษณ์ที่ได้รับการแก้ไขหรือชื่อไฟล์บัญญัติ
ปาโบล

8

คุณสามารถใช้ pmap ฉันกำลังค้นหา PID 6649 และตัดรายละเอียดกระบวนการพิเศษออก

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

คำสั่งนี้ช่วยฉันได้มากกว่าที่ฉันต้องการฉันมีกระบวนการทั้งหมดที่เริ่มต้น กำหนดกระบวนการ Java ด้วยpsคำสั่งทั้งหมดที่คุณจะเห็นเป็นเพียงแต่ส่วนที่เหลือของพารามิเตอร์ผ่านจะแสดงอย่างเต็มที่กับjava pmap
Daniel Andrei Mincă

3

คุณยังสามารถใช้ awk ร่วมกับ ps

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

ตัวอย่าง:

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

เพื่อพิมพ์ HEAD LINE ที่คุณสามารถใช้ได้

 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
สิ่งนี้ไม่เสถียรเนื่องจากจะเลือกกระบวนการที่รวมหมายเลขใดก็ได้ในคำสั่งด้วย ลองps ax | grep 1ดูว่ามันส่งคืนinitกระบวนการจริงหรือไม่ (ในกรณีของฉันก็จะส่งกลับ 119 เส้นไม่เป็นที่น่าพอใจ.)
slhck

1
@slhck แก้ไขคำตอบ ... ขอบคุณสำหรับข้อมูล .. ps -p 1 -o comm =เป็นตัวเลือกที่ดีที่สุดสำหรับคำถามนี้
Gangadhar

เราไม่ต้องการการวิ่งสองครั้งเพื่อรักษาส่วนหัวแทนที่จะใช้ps aux | awk 'NR==1 || $2==PID'- และไม่จำเป็นต้องพูด{print $0}เพราะเป็นค่าเริ่มต้น แต่ในขณะที่คุณแสดงความคิดเห็น-pจะดีกว่าอยู่แล้ว
dave_thompson_085

3

Simmilar to slhck's Answerแต่อาศัยการทำงานของไฟล์แทนการเรียกใช้คำสั่ง:

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

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init ไม่ใช่ / sbin / init คำตอบของเขามีเวอร์ชันที่ยาวกว่า แต่ +1 อยู่ดี
OmarOthman

2

น่าแปลกที่ไม่มีใครพูดถึงตัวเลือก -f (คำสั่งเต็ม) สำหรับ ps ฉันชอบที่จะใช้กับ -e (ทุกอย่าง) และไพพ์ผลลัพธ์เพื่อ grep เพื่อให้ฉันสามารถ จำกัด การค้นหาของฉัน

ps -ef | grep <PID>

นอกจากนี้ยังเป็นประโยชน์อย่างมากสำหรับการดูคำสั่งทั้งหมดที่มีคนใช้ซึ่งใช้ทรัพยากรจำนวนมากในระบบของคุณ นี่จะแสดงตัวเลือกและอาร์กิวเมนต์ที่ส่งไปยังคำสั่ง


3
ใช้งานไม่ได้กับ BSD (อาจรวมถึง MacOSX ด้วยฉันไม่แน่ใจ) แม้-e -fจะมีให้บริการgrepก็สามารถสร้างการแข่งขันที่ผิดพลาดได้หลายอย่างเช่นgrep 33pid = 933 หรือ 339, ppid = 33 หรือ 933 หรือ 339, ใช้เวลา 33 วินาทีหรือ 33 นาทีหรือชื่อโปรแกรมหรืออาร์กิวเมนต์ที่มี 33 - รวมถึงgrepตัวมันเอง ทั้งหมด (AFAIK) psจะมีดังนั้นเพียงแค่-p ps -fp 33
dave_thompson_085

0

ฉันค้นหาวิธีที่ง่ายที่สุดที่จะอยู่กับคำสั่งต่อไปนี้:

ps -awxs | grep pid

นอกเหนือจากการไม่มีประสิทธิภาพสูงเมื่อเทียบกับps -p${pid}นี้จะรับบวกเท็จมากมาย - รวมถึงgrepตัวเอง
Toby Speight

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.