找出正在运行的进程的当前工作目录?

找出正在运行的进程的当前工作目录?

可以使用哪些命令来查找正在运行的进程的当前工作目录 (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}'

获取进程的工作目录..

相关内容