2015/12/15

Recent entries from same category

  1. ぼくがかんがえたさいきょうの rebuild.fm クライアント
  2. サーバを再起動したら勝手にscreenが起動してその中でirssiが動いていて欲しい場合のベストプラクティス
  3. grep で文字列を縦書きに変換
  4. Jekyll Meets Gitolite
  5. WalkmanをLinuxでSonicStage無しに転送する方法

linux - .bashrcでexportしたPATHが/procにあるプロセスファイルの環境変数(PATH)と一致しないように見える - スタック・オーバーフロー

Ubunt 15.04 を使っています。 どういう際に利用するかは措いておくとして、 /proc にある各プロセスIDの名前がついたディレクトリにある、 environ というファイルを、プログラミン...

http://ja.stackoverflow.com/q/19984/440

回答の中で答えられている通り、/proc/$$/environ (/proc/self/environ)は、プログラム起動時の環境変数だけが表示される。プロセスが起動中に設定した環境変数は表示されない。

pid1

なんとかして取れないかなーと思って以下のスクリプトを書いた。

#!/bin/bash

if [ "x$2" == "x" ]; then
  GREP=cat
else
  GREP="grep ^$2="
fi

gdb -q --silent -p $1 <<EOF | grep XXXXXXX | cut -c9- | $GREP
set \$i=0
while (1)
  set \$r=*((char**)environ+\$i)
  if (\$r == 0)
    loop_break
  end
  printf "\\nXXXXXXX %s\\n", \$r
  set \$i++
end
EOF

これにプロセスIDを指定して起動すると

pid2

動的に設定された環境変数の値が取れる(第二引数に環境変数名を指定してもok)。仕組みはコードを見ると分かるが、environ のポインタをずらしながら値を表示する gdb スクリプトを実行してる。

ただしこの方法は、あくまで setenv(3) を使って environ を更新するプログラムに限られる。例えば bash のあるバージョンでは environ を更新しないらしく、このスクリプトを持っても環境変数が取れなかった。言語処理系の中には環境変数は自プロセスには反映せず子プロセスの起動時のみ使用する物もあるので、そういった場合には使用出来ない。

Posted at by