คำสั่งใดที่สามารถใช้เพื่อค้นหาไดเรกทอรีการทำงานปัจจุบัน (CWD) ของกระบวนการที่กำลังทำงานอยู่ เหล่านี้จะเป็นคำสั่งที่คุณสามารถใช้จากภายนอกได้
คำสั่งใดที่สามารถใช้เพื่อค้นหาไดเรกทอรีการทำงานปัจจุบัน (CWD) ของกระบวนการที่กำลังทำงานอยู่ เหล่านี้จะเป็นคำสั่งที่คุณสามารถใช้จากภายนอกได้
คำตอบ:
มี 3 วิธีที่ฉันทราบ:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ 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
/proc
ทุกคนต้องมี
pwdx
ทำงานได้สำหรับฉัน
pgrep <process-name>
ฉันคิดว่าคุณมีกระบวนการ 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
pwdx
Unixes อื่น ๆ ได้หรือไม่?
pwdx
มีอยู่บน Solaris ตั้งแต่ศตวรรษที่ 20, Linux ตั้งแต่กลางปี 2000 (เลียนแบบ Solaris, หน้าคนพูดว่า) ไม่ปรากฏในระบบปฏิบัติการยูนิกซ์ AFAIK อื่น ๆ
pwdx
มี
หากระบบของคุณมี/proc
คุณสามารถทำได้:
readlink -e /proc/$$/cwd
หากคุณต้องการค้นหา CWD จากกระบวนการที่แตกต่างจากกระบวนการที่คุณสนใจคุณจะต้องแทนที่$$
ด้วย PID ของกระบวนการที่คุณสนใจอย่างชัดเจน
ตาม @Gilles คำตอบ ..
ถ้าคุณรู้จักPIDของกระบวนการของคุณ .. สำหรับMac OSXและLinux ให้ใช้:
lsof -p PID | awk '$4=="cwd" {print $9}'
รับ dir ของกระบวนการทำงาน ..