ฉันจะรู้เส้นทางที่แน่นอนของกระบวนการทำงานได้อย่างไร


93

หากฉันมีหลายแอปพลิเคชันเดียวกันบนดิสก์และมีเพียงแอปพลิเคชันเดียวที่ฉันสามารถดูได้psฉันจะทราบเส้นทางสัมบูรณ์เพื่อแยกความแตกต่างจากที่อื่นได้อย่างไร

คำตอบ:


110
% sudo ls -l /proc/PID/exe

เช่น:

% ps -auxwe | grep 24466
รูท 24466 0.0 0.0 1476 280 S 2009 0:00 น. กำกับดูแล sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 รูทราก 0 ก.พ. 1 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise

1
ในระบบของฉัน (Ubuntu 14.04) คุณไม่จำเป็นต้องเป็น superuser ในการเรียกใช้lsคำสั่ง
jarno

3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- ไม่เกี่ยวกับการเรียกใช้lsคำสั่ง แต่เกี่ยวกับการเข้าถึงข้อมูลกระบวนการของกระบวนการที่ไม่ได้เป็นของคุณ ในกล่องของฉันประมาณ 97% ของกระบวนการทั้งหมดที่ระบุไว้ใน / proc เป็นกระบวนการรูท
Irfy

20

ใช้:

pwdx $pid

สิ่งนี้ให้ไดเรกทอรีการทำงานปัจจุบันของ pid ไม่ใช่พา ธ สัมบูรณ์

โดยปกติแล้วwhichคำสั่งจะบอกคุณว่ากำลังถูกเรียกใช้จากเชลล์:

#> which vlc
/usr/bin/vlc

3
คำตอบนี้ต้อง upvote อื่น ๆ ..
Kokizzu

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

วิธีที่ชัดเจนคำตอบนี้ไม่ถูกต้อง: บนเครื่องของฉันฉันเรียกใช้กระบวนการด้วย JDK รุ่นต่างๆและ 32 บิต / 64 บิต หากฉันต้องการระบุรุ่น jstack / jmap ที่ถูกต้องสำหรับกระบวนการคำตอบข้างต้นจะไม่ทำงานในขณะที่คำตอบที่ยอมรับจะใช้
Daniel Da Cunha

@Kokizzu เพียงตอบคำถามนี้ "ไดเรกทอรีการทำงานปัจจุบันของกระบวนการ$pidคืออะไร" โพสต์ที่แก้ไขแล้วยังไม่ตอบคำถาม whichเพียงแค่บอกว่า "ถ้าคำสั่งอยู่บนเส้นทางแล้วมันคืออะไร"
John Strood

pwdxกลับฉันเส้นทางที่แน่นอนของโปรแกรม exectuable ของกระบวนการขึ้นอยู่กับ pid ใน redhat x64 6.3
Nick Dong

14

วิธีหนึ่งคือ ps -ef


5
ไม่ได้ทำงานสำหรับการบริการที่เฉพาะเจาะจงมันเพียงแค่ให้เส้นทางญาติ
Jader Dias

ช่วยฉันระบุกระบวนการผ่านคำสั่งที่เริ่มต้นด้วย
jpierson

6

1
ไม่แสดงเส้นทางที่ผ่านการรับรองทั้งหมดใน linux ของฉัน: "root 24466 0.0 0.0 1476 280 หรือไม่ S 2009 0:00 supervise sshd" ตัวอย่างเช่น
akira

นี่เป็นคำตอบที่แม่นยำกว่าคำตอบอื่น ๆ ... อาจจะไม่เป็นประโยชน์ แต่ก็เป็นคำตอบที่ถูกกว่า upvoted
John Hunt

2

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

ดูUnix FAQสำหรับรายละเอียดเพิ่มเติมเล็กน้อยโดยเฉพาะคำถามที่ 4.3 และ 4.4


2

ทำไมทุกคนคาดหวังให้คุณรู้จัก PID? นี่คือวิธีที่เป็นมิตรกับมนุษย์:

pwdx `pgrep ###process_name###`

คำถามระบุว่า“ อย่างที่ฉันเห็นด้วยps” ดังนั้นมันอาจจะแสดง PID
Scz

อ่าใช่จริง ฉันยังคงพบว่ามันเป็นซับที่เร็วกว่าในหลายกรณีการใช้งานของฉัน
moodboom

1

lsof เป็นตัวเลือก คุณสามารถลองทำสิ่งต่อไปนี้:

lsof -p PROCESS_ID

นี่จะแสดงรายการไฟล์ทั้งหมดที่เปิดโดยกระบวนการรวมถึงตำแหน่งจริงของไฟล์เรียกทำงาน จากนั้นเป็นไปได้ที่จะเพิ่ม awk, cut, grep และอื่น ๆ อีกเล็กน้อยเพื่อค้นหาข้อมูลที่คุณต้องการ

ตัวอย่างฉันใช้คำสั่งต่อไปนี้เพื่อระบุว่า 'java' กระบวนการของฉันมาจากที่ใด:

lsof -p 12345 | awk '{พิมพ์ $ NF}' | grep 'java $'


สิ่งนี้แตกต่างจากคำตอบที่โพสต์แล้วหรือไม่
Pimp Juice IT

0

คุณสามารถใช้

readlink /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe

หรือ

find /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe -printf "%l\n"

เพื่อให้ได้เส้นทางที่แน่นอน PID เป็นกระบวนการ

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