Answers:
我知道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
/proc
。
pwdx
为我工作。
pgrep <process-name>
我假设您在中具有进程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
pwdx
对其他Unix 的普遍性发表评论吗?
pwdx
从20世纪开始出现在Solaris上,从2000年代中期开始出现在Linux上(手册页说的是模仿Solaris)。在其他任何UNIX AFAIK上均不存在。
pwdx
那里吗?