【问题标题】:Is there a way to read environment variables of other processes using Perl and in a Linux or Solaris environment?有没有办法使用 Perl 在 Linux 或 Solaris 环境中读取其他进程的环境变量?
【发布时间】:2010-10-05 20:25:03
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: linux perl solaris environment-variables root


    【解决方案1】:

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

    它们似乎没有在启动后跟踪流程环境的变化。

    这表明您必须剖析进程内存转储才能获得所需的内容。

    棘手。

    【讨论】:

    • Solaris /proc 文件系统 (Solaris 10) 似乎不包括原始环境。
    • @Jonathan,查看 /proc/pid/psinfo 文件,并查看 中的 struct psinfo。字段 pr_envp 是初始环境。
    【解决方案2】:

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

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

    【讨论】:

    • 我也来到这里寻找非 perl Linux 特定的答案。 /proc/$$/environ 是一个空分隔的KEY=value 字符串列表(我是通过询问xxd /proc/$$/environ 发现的,但它可能记录在某处)。您可以仅使用标准 POSIX 工具将其变成更具可读性的内容。只需使用cat /proc/$$/environ | tr '\0' '\n'。
    • @alsuren 谢谢。这样可行。 xxd 和使用 tr 来修复输出都非常有帮助。
    【解决方案3】:

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

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

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

    否则,虽然我看到你说你不想分叉,但一个简单的解决方案可能会启动大约 20 行 C 来生成一个小程序,它只是在 Solaris 上吐出与 Linux 完全相同的环境environ 文件。我已经在 C 中有一些非常相似的东西。如果你有兴趣,我可以发帖。

    编辑(在阅读OpenSolaris pargs.c 之后):环境缓冲区在Solaris 下会在环境发生变化时重新分配,因此psinfo 指针可能无效。对于防弹解决方案,您需要寻找 _environ。这可能比您需要的更麻烦...pargs -e <pid> 可能是 UCB ps(1) 更好的替代品,如果您确实走分叉路线。

    【讨论】:

    • 要明确:pargs -e 是要走的路(将其包装在 perl 系统调用中)
    【解决方案4】:

    我首先想到的是使用 GDB 附加到 有问题的进程,然后要求 GDB 获取环境 你。您可以使用 GDB 中的“显示环境”命令来执行此操作 外壳。

    看起来有一个 Perl 模块可以为您执行此操作, Devel::GDB。我还没有 试过了,但它看起来像一个简单的编程问题 创建 Devel::GDB 对象,连接到你想要的进程 检查,发送“显示环境”命令,然后解析 结果。

    我不得不说...当解决方案如此复杂时,您 可能做错了什么。为什么需要 无论如何,随机过程的环境?

    【讨论】:

    • Quote: 为什么你需要随机过程的环境呢?这是收集系统上运行的进程信息的脚本的一部分。保存数据以供以后分析。
    • show environment 显示 gdb 的环境,而不是它所附加的进程。来自 gdb 手册:“打印环境变量 varname 的值,以便在程序启动时提供给它。”换句话说,如果您计划启动一个程序,show environment 很有帮助,但它对于告诉您您附加到的程序的环境没有用处。如果我错了,请纠正我,但我的测试和对手册的阅读表明这个答案是完全不正确的。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        • 2010-09-17
        • 1970-01-01
        • 2020-10-29
        相关资源
        最近更新 更多