Hib*_*u57 8 shell ipc posix cwd
Linux 有一个/proc目录和文件系统,据我所知,它不是 POSIX 的一部分。在每个/proc/$PID子目录中,是一个符号链接,cwd指向该PID进程的实际工作目录(该cwd链接始终是最新的)。
这个符号链接对于某些用例很方便,比如使用不同的 shell 和在两个 shell 之间交换文件(正式地,它们的工作目录)。
有没有一种简单的方法来获得类似的东西,只使用 POSIX 功能?
发表评论后,更精确:它不一定是链接和环境变量 lile $<PID>_CWD,也一样好,虽然乍一看,我不相信这样的解决方案存在。它必须易于引用(例如符号链接或环境变量),并且每次其他进程切换其工作目录时始终保持最新。
解决方案不一定是POSIX,最重要的是可移植性,但POSIX肯定是一种保证。
我有一个使用lsof. 默认情况下它没有安装在 BSD 上,所以如果有人想在 BSD 上使用它,则需要安装它。
编写一个shell脚本:
#!/bin/sh
lsof -p $1 | grep cwd | awk '{print $9}'
Run Code Online (Sandbox Code Playgroud)
将其复制到您路径中的目录中。它打印第一个参数 IE 中给出的 PID 的工作目录
$ script 1987
/home/enedil
Run Code Online (Sandbox Code Playgroud)
POSIX 在获取有关不相关进程的信息方面提供的功能不多。只有ps,真的,它没有提供有关当前目录的任何信息。C 级 APIps也好不到哪里去(事实上,大多数检索到的信息只能通过解析其输出来检索¹)。
有趣的是,POSIX 确实提供了一种可移植的方式来反过来:给定一个文件,您可以通过调用fuser. 以下代码段列出了具有特定工作目录的进程的 PID:
fuser -f "$directory_name" 2>&1 | sed -e '$!d' -e 's/.*://' -e 's/ */\
/' | sed -n 's/c$//p'
Run Code Online (Sandbox Code Playgroud)
如果您希望以实践中可移植的方式获得有关进程的信息,请使用lsof。lsof 的作者已经完成了在不同的 unix 变体上实现所有不同的检索信息的方法的工作。
对于休闲浏览:
lsof -a -p "$pid" -d cwd
Run Code Online (Sandbox Code Playgroud)
对于自动解析:
lsof -a -p "$pid" -d cwd -F n | sed -e '1d' -e '2s/^n//'
Run Code Online (Sandbox Code Playgroud)
请注意,lsof用字符串替换换行符\n。
一些 Unix 变体提供不需要第三方软件的方法,但这些方法将强制特定于每个变体。在一个非常相关的注释中,请参阅文件描述符链接的可移植性
¹一些旧的 unice 有pssetuid root 和读取内核内存,因此使用 setuid 二进制文件是获取此信息的唯一方法。