可以使用哪些指令來尋找正在執行的進程的目前工作目錄 (CWD)?這些是您可以在流程外部使用的命令。
答案1
我知道有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
答案2
我假設您的進程 ID 位於pid
.大多數系統上的大多數方法都要求您執行此操作的 shell 以與目標進程(或 root)相同的使用者身分執行。
在 Linux 和 Solaris 以及其他一些 System V 單機上:
cd /proc/$pid/cwd && pwd
在 Linux 上(不可用的嵌入式系統除外readlink
),但不適用於 Solaris:
readlink /proc/$pid/cwd
在幾乎任何 Unix 變體上,您都可以使用lsof
。請注意,如果有換行符,它將被列印為\n
(與後跟反斜線無法區分n
)。如果您覺得幸運,您可以使用第二種形式,它會默默地阻塞目錄名稱中的所有空格。
lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'
額外的好處:如果您需要使進程更改其當前目錄,您可以使用偵錯器來完成。例如,將不關心其當前目錄的長時間運行的程式移出要刪除的目錄時非常有用。並非所有程式都喜歡在其腳下更改當前目錄 - 例如 shell 可能會崩潰。
#!/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
答案3
如果您的系統有/proc
,您始終可以執行以下操作:
readlink -e /proc/$$/cwd
如果您想從與您感興趣的進程不同的進程中找出 CWD,則顯然需要替換$$
為您感興趣的進程的 PID。
答案4
基於@Gilles 的回答..
如果你知道的話PID你的流程..對於蘋果電腦和Linux使用:
lsof -p PID | awk '$4=="cwd" {print $9}'
取得進程的工作目錄..