在Linux或Solaris环境中,是否有方法使用Perl读取其他进程的环境变量?

在Linux或Solaris环境中,是否有方法使用Perl读取其他进程的环境变量?,linux,perl,solaris,environment-variables,root,Linux,Perl,Solaris,Environment Variables,Root,在Perl中,我需要阅读其他进程的环境 脚本正在以root用户身份运行 特权 脚本将是 在Linux和Solaris中运行 我想要一个基本上不依赖于平台的解决方案,至少在Linux和Solaris之间是这样。在Linux中,检查/env//environ可以得到答案 我想避免使用叉子。我已经有了一个解决方案分叉“/usr/ucb/ps-auxwwwe$pid” 有什么想法吗?在linux中,/proc//environpsuedo文件似乎包含创建进程时传递的environ变量。如果您有足够的

在Perl中,我需要阅读其他进程的环境

  • 脚本正在以root用户身份运行 特权
  • 脚本将是 在Linux和Solaris中运行
  • 我想要一个基本上不依赖于平台的解决方案,至少在Linux和Solaris之间是这样。在Linux中,检查/env//environ可以得到答案
  • 我想避免使用叉子。我已经有了一个解决方案分叉“/usr/ucb/ps-auxwwwe$pid”

有什么想法吗?

在linux中,
/proc//environ
psuedo文件似乎包含创建进程时传递的environ变量。如果您有足够的权限,您可以阅读这些内容

它们似乎无法跟踪启动后流程环境中的更改

这意味着您必须断开进程内存转储才能获得所需的内容


棘手。

我想到的第一件事是使用GDB连接到 有问题的流程,然后要求GDB获取所需的环境 你。您可以使用GDB中的“show environment”命令来实现这一点 贝壳

看起来有一个Perl模块可以为您实现这一点, . 我没有 虽然已经尝试过了,但它看起来只是一个简单的编程问题 创建Devel::GDB对象,连接到您想要的进程 检查,发送“show environment”命令,然后解析 结果

但是我不得不说。。。当解决方案如此复杂时,您 你可能做错了什么。你为什么需要这个
如果ps可以做到,就像你说的那样,那么你的答案可以在ps的源代码中找到。这将避免产生新的进程。

对于Solaris,你可以尝试。尽管这个模块看起来还很年轻,但这句话听起来很有希望:

Brian Farrell发送了一个非常有用的补丁来处理 argv和工艺环境的检查 而不是当前正在运行的进程

我想这可能只是初始环境(就像linux下的
environ
文件),但这似乎就是您想要的

否则,尽管我看到你说你不想使用fork,但一个简单的解决方案可能是使用大约20行C语言来生成一个小程序,该程序只需在Solaris上生成与Linux
environ
文件完全等效的环境。我在C语言中已经有了类似的东西。如果你感兴趣,我可以把它贴出来


编辑(在阅读OpenSolaris pargs.c之后):当环境发生变化时,环境缓冲区将在Solaris下重新分配,因此psinfo指针可能无效。要想找到防弹的解决方案,你需要找到环境。这可能比你需要的麻烦多了<但是,如果您选择分叉路线,code>pargs-e可能是UCB
ps(1)
的更好替代品。

GNU“binutils”包包含一个名为
strings
的CLI实用程序。有关更多信息,请参阅


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

在Linux上,解析
/proc/[pid]/cwd
符号链接可能就足够了,请参阅。

Solaris/proc文件系统(Solaris 10)似乎甚至不包含原始环境。@Jonathan,请查看/proc/pid/psinfo文件,并从中查看struct psinfo。字段pr_envp是初始环境。无论如何,为什么您需要随机进程的环境?这是收集系统上运行的进程信息的脚本的一部分。数据将保存以供以后分析。show environment显示gdb的环境,而不是它所连接的进程。在gdb手册中:“打印环境变量varname的值,以便在程序启动时提供给它。”换句话说,如果您计划启动一个程序,show environment会很有帮助,但它对于告诉您所连接的程序的环境没有帮助。如果我错了,请纠正我,但是我的测试和阅读手册表明这个答案完全不正确。我来这里也是为了寻找一个非perl Linux特定的答案
/proc/$$/environ
是由
KEY=value
字符串组成的空分隔列表(我是通过询问
xxd/proc/$$/environ
发现的,但可能在某处有文档记录)。只需使用标准POSIX工具,就可以将其转换为更具可读性的内容。只需使用
cat/proc/$$/environ | tr'\0'\n'
@alsuren谢谢。这很有效。xxd和使用tr来修复输出都非常有帮助