有没有办法使用Perl在Linux或Solaris环境中读取其他进程的环境变量?
在Perl中,我需要读取其他进程的环境。有没有办法使用Perl在Linux或Solaris环境中读取其他进程的环境变量?
- 该脚本以root 特权运行。
- 该脚本将在Linux和Solaris中运行 。
- 我想要一个基本上与平台无关的解决方案,至少在Linux和Solaris之间。在Linux中,检查/ env/< proc_id>/environ可以得到我的答案。我想避免不得不分叉。我已经有一个解决方案分叉“/ usr/ucb/ps -auxwwwe $ pid”
任何想法?
对于Solaris,您可以尝试procfs module from CPAN。尽管该模块依然显得很年轻,这句话听起来有希望:
布莱恩·法雷尔发送它处理的argv和比当前运行的进程的其他进程 环境 检查一个非常有用的补丁。
我想这可能只是初始环境(就像linux下的environ
文件一样),但这似乎是你想要的吗?否则,虽然我看到你说你不想分叉,但一个简单的解决方案可能会启动~20行C来产生一个小程序,它只是将Solaris环境中的环境吐出, Linux environ
文件。我已经有了一些非常类似于C的东西。如果你有兴趣,我可以发布它。
编辑(读完OpenSolaris pargs.c后):当环境发生变化时,环境缓冲区在Solaris下重新分配,因此psinfo指针可能无效。对于防弹解决方案,您需要搜索_environ。这可能比你需要的更麻烦... pargs -e <pid>
可能是一个更好的替代UCB ps(1)
如果你去叉路线,但。
在linux中,它看起来像/proc/<pid>/environ
psuedofiles包含创建进程时传递的environ变量。如果你有足够的权限,你可以阅读这些。
它们似乎没有在启动后跟踪进程环境中的更改。
这表明您将不得不检查进程内存转储以获取您要求的内容。
棘手。
我想到的第一件事就是使用GDB附加到 进程中,然后让GDB为您获取 的环境。您可以使用GDB shell中的“show environment”命令执行此操作。
它看起来像有一个Perl模块可以为你做到这一点, Devel::GDB。我还没有 试过了,但是看起来好像是一个简单的编程问题到 创建了Devel :: GDB对象,连接到你想要检测的进程 ,发送“show environment”命令,然后解析 结果。
虽然我不得不说,但...当解决方案是复杂的,你 可能是做了其他错误。为什么你需要 环境进行随机过程?
Quote: 为什么你需要一个随机过程的环境,无论如何? 这是收集有关系统上运行的进程信息的脚本的一部分。数据被保存以便稍后分析。 – 2009-02-06 04:49:13
如果ps能做到这一点,就像你说的那样,那么你的答案可以在ps的源代码中找到。这将避免新流程的产生。
GNU'binutils'软件包包含一个名为strings
的CLI实用程序。有关更多信息,请参阅http://www.gnu.org/software/binutils/。
strings /proc/pid/environ
- 打印出一个很好的环境变量列表,很像env
。
heh。看起来我没有真正阅读他的问题。抱歉。 – dmckee 2009-02-06 03:34:42
Solaris/proc文件系统(Solaris 10)似乎甚至不包括原始环境。 – 2009-02-06 03:53:03
@Jonathan,看看/ proc/pid/psinfo文件,并从查看struct psinfo。字段pr_envp是初始环境。 –
2009-02-07 13:27:21