2009-02-06 29 views
9

在Perl中,我需要讀取其他進程的環境。有沒有辦法使用Perl在Linux或Solaris環境中讀取其他進程的環境變量?

  • 該腳本以root 特權運行。
  • 該腳本將在Linux和Solaris中運行 。
  • 我想要一個基本上與平臺無關的解決方案,至少在Linux和Solaris之間。在Linux中,檢查/ env/< proc_id>/environ可以得到我的答案。我想避免不得不分叉。我已經有一個解決方案分叉「/ usr/ucb/ps -auxwwwe $ pid」

任何想法?

回答

7

對於Solaris,您可以嘗試procfs module from CPAN。儘管該模塊依然顯得很年輕,這句話聽起來有希望:

布萊恩·法雷爾發送它處理的argv和比當前運行的進程的其他進程 環境 檢查一個非常有用的補丁。

我想這可能只是初始環境(就像linux下的environ文件一樣),但這似乎是你想要的嗎?否則,雖然我看到你說你不想分叉,但一個簡單的解決方案可能會啓動~20行C來產生一個小程序,它只是將Solaris環境中的環境吐出, Linux environ文件。我已經有了一些非常類似於C的東西。如果你有興趣,我可以發佈它。

編輯(讀完OpenSolaris pargs.c後):當環境發生變化時,環境緩衝區在Solaris下重新分配,因此psinfo指針可能無效。對於防彈解決方案,您需要搜索_environ。這可能比你需要的更麻煩... pargs -e <pid>可能是一個更好的替代UCB ps(1)如果你去叉路線,但。

12

在linux中,它看起來像/proc/<pid>/environ psuedofiles包含創建進程時傳遞的environ變量。如果你有足夠的權限,你可以閱讀這些。

它們似乎沒有在啓動後跟蹤進程環境中的更改。

這表明您將不得不檢查進程內存轉儲以獲取您要求的內容。

棘手。

+0

heh。看起來我沒有真正閱讀他的問題。抱歉。 – dmckee 2009-02-06 03:34:42

+0

Solaris/proc文件系統(Solaris 10)似乎甚至不包括原始環境。 – 2009-02-06 03:53:03

+0

@Jonathan,看看/ proc/pid/psinfo文件,並從查看struct psinfo。字段pr_envp是初始環境。 – 2009-02-07 13:27:21

5

我想到的第一件事就是使用GDB附加到 進程中,然後讓GDB爲您獲取 的環境。您可以使用GDB shell中的「show environment」命令執行此操作。

它看起來像有一個Perl模塊可以爲你做到這一點, Devel::GDB。我還沒有 試過了,但是看起來好像是一個簡單的編程問題到 創建了Devel :: GDB對象,連接到你想要檢測的進程 ,發送「show environment」命令,然後解析 結果。

雖然我不得不說,但...當解決方案是複雜的,你 可能是做了其他錯誤。爲什麼你需要 環境進行隨機過程?

+0

Quote: 爲什麼你需要一個隨機過程的環境,無論如何? 這是收集有關係統上運行的進程信息的腳本的一部分。數據被保存以便稍後分析。 – 2009-02-06 04:49:13

2

如果ps能做到這一點,就像你說的那樣,那麼你的答案可以在ps的源代碼中找到。這將避免新流程的產生。

8

GNU'binutils'軟件包包含一個名爲strings的CLI實用程序。有關更多信息,請參閱http://www.gnu.org/software/binutils/

strings /proc/pid/environ - 打印出一個很好的環境變量列表,很像env

0

在Linux上,解析/proc/[pid]/cwd符號鏈接可能已足夠,請參閱procfs(5)