Tìm ra thư mục làm việc hiện tại của một quá trình đang chạy?


167

Những lệnh nào người ta có thể sử dụng để tìm ra thư mục làm việc hiện tại (CWD) của một tiến trình đang chạy? Đây sẽ là các lệnh bạn có thể sử dụng bên ngoài từ quy trình.

Câu trả lời:


217

Có 3 phương pháp mà tôi biết:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ Proc

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

Ví dụ

Nói rằng chúng tôi có quá trình này.

$ pgrep nautilus
12136

Sau đó, nếu chúng ta sử dụng pwdx:

$ pwdx 12136
12136: /home/saml

Hoặc bạn có thể sử dụng lsof:

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

Hoặc bạn có thể chọc trực tiếp vào /proc:

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

2
Tôi sẽ nói / Proc là hợp quy, với lsof là hữu ích, nhưng pwdx thì tuyệt vời.
ChuckCottrill

3
Không phải tất cả các Unices đều có /proc.
rebierpost

Một câu hỏi tương tự nhưng khác nhau: unix.stackexchange.com/questions/173868/ mẹo
Đánh bạc Sibbs

1
pwdxlàm việc cho tôi
aroth 8/2/2016

Đây là một cách đơn giản (từ câu trả lời của slm) pwdxpgrep <process-name>
Madhusoodan P

27

Tôi giả sử rằng bạn có ID tiến trình pid. Hầu hết các phương thức trên hầu hết các hệ thống sẽ yêu cầu trình bao bạn đang thực hiện việc này đang chạy cùng một người dùng với quy trình đích (hoặc root).

Trên Linux và Solaris và có lẽ một số hợp nhất System V khác:

cd /proc/$pid/cwd && pwd

Trên Linux (ngoại trừ các hệ thống nhúng readlinkkhông khả dụng) nhưng không phải Solaris:

readlink /proc/$pid/cwd

Trên bất kỳ biến thể unix, bạn có thể sử dụng lsof. Xin lưu ý rằng nếu có một dòng mới, nó sẽ được in dưới dạng \n(không thể phân biệt với dấu gạch chéo ngược theo sau n). Nếu bạn cảm thấy may mắn, bạn có thể sử dụng hình thức thứ hai, âm thầm bóp nghẹt tất cả các khoảng trắng trong tên thư mục.

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

Phần thưởng: nếu bạn cần gây ra một quy trình để thay đổi thư mục hiện tại của nó, bạn có thể thực hiện nó với trình gỡ lỗi. Điều này rất hữu ích, ví dụ để di chuyển một chương trình chạy dài mà không quan tâm đến thư mục hiện tại của nó ra khỏi thư mục mà bạn muốn xóa. Không phải tất cả các chương trình đều đánh giá cao việc thư mục hiện tại của họ thay đổi dưới chân - ví dụ như một chiếc vỏ có khả năng bị sập.

#!/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

Liên lạc tốt đẹp thêm các chi tiết trong về di chuyển. Tốt nugget để thêm vào trang web!
slm

Bạn có thể bình luận gì về tính phổ biến của pwdxcác Unix khác không?
slm

Trên OpenBSD, ít nhất, lsof chỉ báo cáo điểm gắn kết của CWD của quy trình.
kurtm

@slm pwdxcó mặt trên Solaris từ thế kỷ 20, Linux từ giữa những năm 2000 (bắt chước Solaris, cho biết trang nam). Không có mặt trên bất kỳ unix AFAIK khác.
Gilles

@kurtm - phương pháp nào tốt hơn trên BSD? Ngoài ra còn pwdxcó?
slm

9

Nếu hệ thống của bạn có /proc, bạn luôn có thể làm:

readlink -e /proc/$$/cwd

Nếu bạn muốn tìm hiểu CWD từ một quy trình khác với quy trình mà bạn quan tâm, rõ ràng bạn cần phải thay thế $$bằng PID của quy trình bạn quan tâm.


0

Dựa trên câu trả lời @Gilles ..

nếu bạn biết PID của quy trình của mình .. cho Mac OSXLinux, hãy sử dụng:

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

để có được hướng dẫn làm việc của quá trình ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.