Câu trả lời:
Có 3 phương pháp mà tôi biết:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ readlink -e /proc/<PID>/cwd
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
/proc
.
pwdx
làm việc cho tôi
pgrep <process-name>
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 readlink
khô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
pwdx
các Unix khác không?
pwdx
có 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.
pwdx
có?
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 OSX và Linux, 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 ..