Shell

找出正在執行的程序的目前工作目錄?

  • November 28, 2021

可以使用哪些命令來找出正在執行的程序的目前工作目錄 (CWD)?這些將是您可以在流程外部使用的命令。

我知道有3種方法:

密碼

$ 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

我假設您在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

引用自:https://unix.stackexchange.com/questions/94357