找出正在運行的進程的目前工作目錄?

找出正在運行的進程的目前工作目錄?

可以使用哪些指令來尋找正在執行的進程的目前工作目錄 (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}'

取得進程的工作目錄..

相關內容