ค้นหาไดเรกทอรีทำงานปัจจุบันของกระบวนการทำงานหรือไม่


167

คำสั่งใดที่สามารถใช้เพื่อค้นหาไดเรกทอรีการทำงานปัจจุบัน (CWD) ของกระบวนการที่กำลังทำงานอยู่ เหล่านี้จะเป็นคำสั่งที่คุณสามารถใช้จากภายนอกได้

คำตอบ:


217

มี 3 วิธีที่ฉันทราบ:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

proc /

$ readlink -e /proc/<PID>/cwd

ตัวอย่าง

สมมติว่าเรามีกระบวนการนี้

$ pgrep nautilus
12136

ถ้าเราใช้pwdx:

$ pwdx 12136
12136: /home/saml

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

$ lsof -p 12136 | grep cwd
nautilus 12136 saml  cwd    DIR              253,2    32768  10354689 /home/saml

หรือคุณสามารถกระตุ้นโดยตรงไปที่/proc:

$ readlink -e /proc/12136/cwd/
/home/saml

2
ฉันจะบอกว่า / proc เป็นที่ยอมรับด้วย lsof เป็นประโยชน์ แต่ pwdx นั้นยอดเยี่ยม
ChuckCottrill

3
ไม่ Unices /procทุกคนต้องมี
reinierpost

คำถามที่คล้ายกัน แต่แตกต่างกัน: unix.stackexchange.com/questions/173868/ …
การพนัน Sibbs

1
pwdxทำงานได้สำหรับฉัน
aroth

นี่เป็นวิธีที่ง่าย (จากคำตอบของ slm) pwdxpgrep <process-name>
Madhusoodan P

27

ฉันคิดว่าคุณมีกระบวนการ ID pidใน วิธีการส่วนใหญ่ในระบบส่วนใหญ่จะต้องการให้เชลล์ที่คุณทำสิ่งนี้ทำงานเป็นผู้ใช้เดียวกันกับกระบวนการเป้าหมาย (หรือรูท)

บน Linux และ Solaris และบางที System V อื่น ๆ :

cd /proc/$pid/cwd && pwd

บน Linux (ยกเว้นระบบฝังตัวที่readlinkไม่พร้อมใช้งาน) แต่ไม่ใช่ Solaris:

readlink /proc/$pid/cwd

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

lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'

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

#!/bin/sh

# Use gdb to change the working directory of a process from outside.
# This could be generalized to a lot of other things.

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
  *[\\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF

สัมผัสที่ดีเพิ่มรายละเอียดเกี่ยวกับการเคลื่อนไหว นักเก็ตเล็ก ๆ น้อย ๆ ที่ดีที่จะเพิ่มไปยังเว็บไซต์!
slm

คุณสามารถแสดงความคิดเห็นเกี่ยวกับความแพร่หลายของpwdxUnixes อื่น ๆ ได้หรือไม่?
slm

บน OpenBSD อย่างน้อย lsof เพียงรายงานจุดเชื่อมต่อของ CWD ของกระบวนการ
kurtm

@slm pwdxมีอยู่บน Solaris ตั้งแต่ศตวรรษที่ 20, Linux ตั้งแต่กลางปี ​​2000 (เลียนแบบ Solaris, หน้าคนพูดว่า) ไม่ปรากฏในระบบปฏิบัติการยูนิกซ์ AFAIK อื่น ๆ
Gilles

@kurtm - มีวิธีใดที่ดีกว่าใน BSD? นอกจากนี้ยังpwdxมี
slm

9

หากระบบของคุณมี/procคุณสามารถทำได้:

readlink -e /proc/$$/cwd

หากคุณต้องการค้นหา CWD จากกระบวนการที่แตกต่างจากกระบวนการที่คุณสนใจคุณจะต้องแทนที่$$ด้วย PID ของกระบวนการที่คุณสนใจอย่างชัดเจน


0

ตาม @Gilles คำตอบ ..

ถ้าคุณรู้จักPIDของกระบวนการของคุณ .. สำหรับMac OSXและLinux ให้ใช้:

lsof -p PID | awk '$4=="cwd" {print $9}'

รับ dir ของกระบวนการทำงาน ..

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