2009-02-06 28 views
9

在Perl中,我需要读取其他进程的环境。有没有办法使用Perl在Linux或Solaris环境中读取其他进程的环境变量?

  • 该脚本以root 特权运行。
  • 该脚本将在Linux和Solaris中运行 。
  • 我想要一个基本上与平台无关的解决方案,至少在Linux和Solaris之间。在Linux中,检查/ env/< proc_id>/environ可以得到我的答案。我想避免不得不分叉。我已经有一个解决方案分叉“/ usr/ucb/ps -auxwwwe $ pid”

任何想法?

回答

7

对于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)如果你去叉路线,但。

12

在linux中,它看起来像/proc/<pid>/environ psuedofiles包含创建进程时传递的environ变量。如果你有足够的权限,你可以阅读这些。

它们似乎没有在启动后跟踪进程环境中的更改。

这表明您将不得不检查进程内存转储以获取您要求的内容。

棘手。

+0

heh。看起来我没有真正阅读他的问题。抱歉。 – dmckee 2009-02-06 03:34:42

+0

Solaris/proc文件系统(Solaris 10)似乎甚至不包括原始环境。 – 2009-02-06 03:53:03

+0

@Jonathan,看看/ proc/pid/psinfo文件,并从查看struct psinfo。字段pr_envp是初始环境。 – 2009-02-07 13:27:21

5

我想到的第一件事就是使用GDB附加到 进程中,然后让GDB为您获取 的环境。您可以使用GDB shell中的“show environment”命令执行此操作。

它看起来像有一个Perl模块可以为你做到这一点, Devel::GDB。我还没有 试过了,但是看起来好像是一个简单的编程问题到 创建了Devel :: GDB对象,连接到你想要检测的进程 ,发送“show environment”命令,然后解析 结果。

虽然我不得不说,但...当解决方案是复杂的,你 可能是做了其他错误。为什么你需要 环境进行随机过程?

+0

Quote: 为什么你需要一个随机过程的环境,无论如何? 这是收集有关系统上运行的进程信息的脚本的一部分。数据被保存以便稍后分析。 – 2009-02-06 04:49:13

2

如果ps能做到这一点,就像你说的那样,那么你的答案可以在ps的源代码中找到。这将避免新流程的产生。

8

GNU'binutils'软件包包含一个名为strings的CLI实用程序。有关更多信息,请参阅http://www.gnu.org/software/binutils/

strings /proc/pid/environ - 打印出一个很好的环境变量列表,很像env

0

在Linux上,解析/proc/[pid]/cwd符号链接可能已足够,请参阅procfs(5)