微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法使用Perl在Linux或Solaris环境中读取其他进程的环境variables?

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

脚本以root权限运行。

该脚本将在Linux和Solaris中运行。

我想要一个解决scheme,主要是平台不可知的,至less在Linux和Solaris之间。 在Linux中,检查/ env / <proc_id> / environ可以得到我的答案。

我想避免分叉。 我已经有一个解决scheme分叉“/ usr / ucb / ps -auxwwwe $ pid”

有任何想法吗?

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

Brian Farrell发送了一个非常有用的补丁,用于处理除当前正在运行的进程以外的进程的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变量。 如果你有足够的权限,你可以阅读这些。

他们似乎没有跟踪发布后的流程环境中的变化。

这表明,你将不得不进程内存转储,以得到你所要求的。

棘手。

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

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

我想到的第一件事就是使用GDB附加到有问题的进程,然后要求GDB为你获得环境。 您可以使用GDB shell中的“show environment”命令来完成此操作。

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

我不得不说,但是,当解决方案是复杂的,你可能做错了什么。 为什么你需要一个随机过程的环境呢?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐