在Perl中,我需要阅读其他进程的环境。
有什么想法吗?
答案 0 :(得分:12)
在linux中看起来/proc/<pid>/environ
psuedofiles包含创建进程时传递的environ变量。如果您有足够的权限,则可以阅读这些权限。
它们似乎不会在启动后跟踪进程环境中的更改。
这表明您必须通过进程内存转储来获取您要求的内容。
棘手。
答案 1 :(得分:10)
GNU'binutils'软件包包含一个名为strings
的CLI实用程序。有关详细信息,请参阅http://www.gnu.org/software/binutils/。
strings /proc/pid/environ
- 打印出一个很好的环境变量列表,就像env
一样。
答案 2 :(得分:7)
对于Solaris,您可以尝试procfs module from CPAN。虽然这个模块看起来还很年轻,但这句话听起来很有希望:
Brian Farrell发送了一个非常有用的补丁来处理 检查argv和流程环境 除了当前正在运行的流程。
我想这可能只是初始环境(就像linux下的environ
文件一样),但这似乎是你想要的?
否则,虽然我看到你说你不想分叉,但是一个简单的解决方案可能会产生~20行C来生成一个只在Linux上吐出环境的小程序,就像Linux的完全相同environ
个文件。我已经在C中有类似的东西。如果您有兴趣,我可以发布。
EDIT(读取OpenSolaris pargs.c之后):当环境发生变化时,在Solaris下重新分配环境缓冲区,因此psinfo指针可能无效。对于防弹解决方案,您需要追捕_environ。这可能比你需要的更麻烦... pargs -e <pid>
可能是UCB ps(1)
的一个更好的替代品,如果你去叉路线的话。
答案 3 :(得分:5)
我想到的第一件事是使用GDB附加到 有问题的过程,然后要求GDB获取环境 您。您可以使用GDB中的“show environment”命令执行此操作 外壳
看起来有一个Perl模块可以为你做到这一点, Devel::GDB。我还没有 尝试过,但它看起来像一个简单的编程问题 创建Devel :: GDB对象,连接到您想要的进程 检查,发送“show environment”命令,然后解析 结果
我不得不说......当解决方案很复杂时,你 可能做错了什么。你为什么需要这个 无论如何,随机过程的环境?
答案 4 :(得分:2)
如果ps可以像你说的那样做,那么你的答案可以在ps的源代码中找到。这样可以避免产生新的过程。
答案 5 :(得分:0)
在Linux上,解析/proc/[pid]/cwd
符号链接可能就足够了,请参阅procfs(5)。