最近ちょっとした必要に迫られ、あるプロセスの環境変数を取得することになりました
結論
/proc/PID/environ
にそのプロセスの持っている環境変数がセットされています
注意事項
各環境変数のKEY=VALUEをNULL文字で結合したものとなっています
つまりそのままだとあまり取り回しが良くありません
/proc/PID/environの内容を改行区切りで出力する
使い勝手の良い改行区切りのリストを出力するためのスクリプトを用意します
process-env
#!/usr/bin/python3
import os
import sys
import shlex
import re
try:
with open(f"/proc/{sys.argv[1]}/environ") as f:
content = f.read();
envList = content.split("\0")
pattern = "([^=]+)=(.*)"
repatter = re.compile(pattern);
for envLine in envList:
result = repatter.match(envLine)
if not result:
continue
key = result.group(1)
value = shlex.quote(result.group(2))
print(f"{key}={value}")
except FileNotFoundError:
os._exit(status=255)
エラー処理とか適当ですが
これで process-env 1
とかやると指定したプロセスIDの(起動時に)持っている環境変数を取得できるようになりました
雑感
ググったらシェルスクリプトで strings /proc/PID/environ
で取れるような記事もありましたが、この場合だと値に $
が含まれる場合に、それをそのままexportするような形にした際にシェルの変数として解釈されてしまいます
$
という文字として解釈したいのでエスケープするためにpythonでshlex.quoteを使ってエスケープするスクリプトを用意しました
phpでescapeshellarg()を使っても良いでしょう
これで無事にあるプロセスが持つ環境変数を取得して利用することが出来るようになりました
それでは良いLinuxライフを