在Perl中,我需要阅读其他进程的环境.
该脚本以root权限运行.
该脚本将在Linux和Solaris中运行.
我想要一个主要与平台无关的解决方案,至少在Linux和Solaris之间.在Linux中,检查/ env/
我想避免不得不分叉.我已经有一个解决方法分叉"/ usr/ucb/ps -auxwwwe $ pid"
有任何想法吗?
在linux中,看起来/proc/
psuedofiles包含创建进程时传递的environ变量.如果您有足够的权限,则可以阅读这些权限.
它们似乎不会在启动后跟踪进程环境中的更改.
这表明您必须将进程内存转储程序分离,以获得您所要求的内容.
棘手.
GNU'binutils'包中包含一个名为CLI的实用程序strings
.有关详细信息,请参阅http://www.gnu.org/software/binutils/.
strings /proc/pid/environ
- 打印出一个很好的环境变量列表env
.
对于Solaris,您可以从CPAN尝试procfs模块.虽然这个模块看起来还很年轻,但这句话听起来很有希望:
Brian Farrell发送了一个非常有用的补丁,用于处理argv和当前正在运行的进程以外的进程环境的检查.
我想这可能只是初始环境(就像environ
linux下的文件一样),但这似乎是你想要的?
否则,虽然我看到你说你不想分叉,但是一个简单的解决方案可能会产生一个小的程序来生成一个小程序,它只是在Solaris上吐出环境,就像Linux environ
文件一样.我已经在C中有类似的东西.如果你有兴趣,我可以发布.
编辑(在读取OpenSolaris pargs.c之后):当环境发生变化时,在Solaris下重新分配环境缓冲区,因此psinfo指针可能无效.对于防弹解决方案,您需要追捕_environ.这可能比你需要的更麻烦...... 如果你去叉路线,pargs -e
可能是UCB更好的替代品ps(1)
.
我想到的第一件事就是使用GDB附加到相关进程,然后让GDB为您获取环境.您可以使用GDB shell中的"show environment"命令执行此操作.
看起来有一个Perl模块可以为你做这个, Devel :: GDB.我还没有尝试过,但它看起来像一个简单的编程问题来创建Devel :: GDB对象,连接到你想要检查的进程,发送"show environment"命令,然后解析结果.
我不得不说......虽然解决方案很复杂,但你可能做错了什么.无论如何,为什么你需要一个随机过程的环境?