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

#1 楼

我知道3种方法:

pwdx

$ pwdx <PID>


lsof

$ 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


评论


我会说/ proc是规范的,其中lsof很有用,但是pwdx很酷。

– ChuckCottrill
13-10-10在0:33



并非所有Unices都有/ proc。

– reinierpost
13-10-10在9:30

一个类似但不同的问题:unix.stackexchange.com/questions/173868/…

– Sibbs赌博
2014年12月12日5:03



pwdx为我工作。

–aroth
16年2月8日在7:11

这是一个简单的方法(从slm的答案)pwdx pgrep <进程名>

– Madhosoodan P
18年5月8日在14:18

#2 楼

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

cd /proc/$pid/cwd && pwd


在Linux上(不提供readlink的嵌入式系统除外)但Solaris不可用: >在几乎所有的Unix变体上,您都可以使用lsof。请注意,如果有换行符,它将被打印为\n(与反斜杠后跟n不能区分)。如果您感到幸运,则可以使用第二种形式,该形式在目录名称中的所有空格处均以静默形式阻塞。

导致进程更改其当前目录,则可以使用调试器进行操作。例如,这对于将不关心其当前目录的长时间运行的程序移出要删除的目录很有用。并非所有程序都喜欢将当前目录放在脚下-例如,外壳可能会崩溃。

readlink /proc/$pid/cwd


评论


很高兴加入有关移动的详细信息。好小金块添加到该站点!

–slm♦
13-10-10在0:56

您可以对其他Unix上pwdx的普遍性发表评论吗?

–slm♦
13年10月10日在1:00

至少在OpenBSD上,lsof仅报告进程的CWD的安装点。

–kurtm
13年10月10日,1:11

@slm pwdx从20世纪开始出现在Solaris上,从2000年代中期开始出现在Linux上(手册页说,它模仿Solaris)。在其他任何UNIX AFAIK上均不存在。

–吉尔斯'所以-不再是邪恶的'
13-10-10在1:12



@kurtm-在BSD上还有更好的方法吗?那里也是pwdx吗?

–slm♦
13-10-10在1:17



#3 楼

如果您的系统具有/proc,则可以始终执行以下操作:显然需要用您感兴趣的过程的PID替换$$

#4 楼

对于macOS:如果您知道PID并希望获取确切的文件/目录(没有其他信息),请使用:
 lsof -a -p 1234 -d cwd -F n | tail -1 | cut -c2-
 

-a:告诉lsof使用AND代替-p以下的-d-p选项的AND:传入进程ID(pid)1234 -d:仅包括文件描述符cwd -F:指定要输出的字段(从此处的字符)
传递给n选项的-F字符会输出3行,用换行符分隔。我们只想要最后一个(当前工作目录)。我们将输出传递到tail以获取最后一行,然后将其传递到cut以修剪第一个字符。

#5 楼

基于@Gilles的答案..

,如果您知道过程的PID ..对于Mac OSX和Linux,请使用:
进程目录..

评论


lsof:警告:无法stat()tracefs文件系统/ sys / kernel / debug / tracing输出信息可能不完整。有人知道吗?

– Sridhar Sarnobat
20-4-26下午5:42