slm*_*slm 220 command-line shell process cwd
可以使用哪些命令来找出正在运行的进程的当前工作目录 (CWD)?这些将是您可以从流程外部使用的命令。
slm*_*slm 296
我知道有3种方法:
$ pwdx <PID>
Run Code Online (Sandbox Code Playgroud)
$ lsof -p <PID> | grep cwd
Run Code Online (Sandbox Code Playgroud)
$ readlink -e /proc/<PID>/cwd
Run Code Online (Sandbox Code Playgroud)
说我们有这个过程。
$ pgrep nautilus
12136
Run Code Online (Sandbox Code Playgroud)
那么如果我们使用pwdx:
$ pwdx 12136
12136: /home/saml
Run Code Online (Sandbox Code Playgroud)
或者你可以使用lsof:
$ lsof -p 12136 | grep cwd
nautilus 12136 saml cwd DIR 253,2 32768 10354689 /home/saml
Run Code Online (Sandbox Code Playgroud)
或者你可以直接进入/proc:
$ readlink -e /proc/12136/cwd/
/home/saml
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 30
我假设您在pid. 大多数系统上的大多数方法都要求您执行此操作的 shell 以与目标进程(或 root)相同的用户身份运行。
在 Linux 和 Solaris 上,也许还有其他一些 System V unice:
cd /proc/$pid/cwd && pwd
Run Code Online (Sandbox Code Playgroud)
在 Linux(readlink不可用的嵌入式系统除外)上,但在 Solaris 上:
readlink /proc/$pid/cwd
Run Code Online (Sandbox Code Playgroud)
在几乎任何 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}'
Run Code Online (Sandbox Code Playgroud)
奖励:如果您需要使进程更改其当前目录,则可以使用调试器来完成。例如,这对于将不关心其当前目录的长时间运行的程序移出要删除的目录很有用。并非所有程序都喜欢在其脚下更改当前目录——例如,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
Run Code Online (Sandbox Code Playgroud)
如果您的系统有/proc,您可以随时执行以下操作:
readlink -e /proc/$$/cwd
Run Code Online (Sandbox Code Playgroud)
如果您想从与您感兴趣的进程不同的进程中找出 CWD,您显然需要$$用您感兴趣的进程的 PID替换。