it-swarm.cn

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

一个人可以使用哪些命令来查找正在运行的进程的当前工作目录(CWD)?这些是您可以在流程外部使用的命令。

185
slm

我知道3种方法:

密码

$ pwdx <PID>

$ 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
243
slm

我假设您在pid中具有进程ID。大多数系统上的大多数方法都将要求您执行此操作的Shell与目标进程(或根)的运行用户身份相同。

在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
28

如果您的系统有/proc,您可以随时执行以下操作:

readlink -e /proc/$$/cwd

如果要从与您感兴趣的过程不同的过程中查找CWD,显然您需要替换$$与您感兴趣的过程的PID。

9
Joseph R.

基于@Gilles答案。

如果您知道 [〜#〜] pid [〜#〜] 的过程..对于Mac OSXLinux使用:

lsof -p PID | awk '$4=="cwd" {print $9}'

获取进程的工作目录。

0
Dariusz Filipiak