9

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

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

有任何想法吗?

4

6 回答 6

12

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

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

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

棘手。

于 2009-02-06T01:58:10.883 回答
11

GNU 'binutils' 软件包包括一个名为strings. 有关更多信息,请参见http://www.gnu.org/software/binutils/

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

于 2009-11-21T23:51:38.767 回答
7

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

Brian Farrell 发送了一个非常有用的补丁,它可以处理除当前运行进程之外的进程的 argv 和环境检查。

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

否则,尽管我看到您说您不想分叉,但一个简单的解决方案可能会启动约 20 行 C 代码来生成一个小程序,该程序只是将 Solaris 上的环境作为 Linuxenviron文件的完全等价物吐出。我已经在 C 中有一些非常相似的东西。如果你有兴趣,我可以发帖。

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

于 2009-02-07T14:02:33.057 回答
4

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

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

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

于 2009-02-06T03:25:31.923 回答
2

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

于 2009-02-06T03:31:53.080 回答
0

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

于 2014-12-27T20:40:49.000 回答