2015/12/15


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



2014/02/19


最強というか、正直懐かしい感じではありますが...
まず mpd と mpc と podget を入れましょう。
$ sudo apt-get install mpd mpc podget そして ~/.podget/serverlist に rebuild.fm を足しましょう。
http://feeds.rebuild.fm/rebuildfm Rebuild crontab で自動起動します。
0 0 * * * /usr/bin/podget -s Ubuntu の場合 /usr/lib/mpd にファイルを置く事になるので
$ sudo usermod -aG audio `whoami` として書き込み権限を得た後
$ sudo ln -s ~/POD/Rebuild /usr/lib/mpd/Rebuild シンボリックリンクを張りましょう。
次に mpd のインデックスを自動更新にしましょう(コメントを外す)。
auto_update "yes" これだけで Linux や OSX 環境では聞ける様になったので Music Player Daemon プロトコル対応のプレーヤさえ探してくれば再生出来ますし、mpd なので何処からでも誰でも(パスワード設定可能)音楽を鳴らせます。mpd はサーバで音を鳴らす代物なので会社のBGMサーバなんかにいいんじゃないかなーとか思います。
また audio_output を httpd にすればストリーミング配信出来るので別の端末でも再生出来ます。 audio_output {
    type        "httpd"
    name        "My HTTP Stream"
    encoder     "vorbis"        # optional, vorbis or lame
    port        "8000"
    #quality        "5.0"           # do not define if bitrate is defined
    bitrate     "128"           # do not define if quality is defined
    format      "44100:16:1"
}
こうしておけば http://localhost:8000/mpd.ogg でストリーミング再生出来ますし、bind_to_address をネットワークアドレスに設定して MPDroid 入れれば、いつでもどこでも Rebuild.fm が聞けますね。この環境、一度作っておくと上記の mpd のフォルダに適当に mp3 ファイルを放り込んでおけば自宅を出ても MPDroid で聞ける様になります。

Rebuild.fm 関係ないですねそうですね。


ちなみに...

golang で rebuild.fm クライアント書いてますんで、使いたい人はどうぞ。
mattn/rebuildfm - GitHub
https://github.com/mattn/rebuildfm
あと vim 版もあります。
mattn/ctrlp-rebuildfm - GitHub
https://github.com/mattn/ctrlp-rebuildfm
Posted at by



2013/07/31


個人的にお借りしているサーバがあってそこで何個かbotを動かしているのだけど、そのサーバがセキュリティアップデート等で再起動した後、ログインしてscreen起動して、その中で画面割ってbot起動して、また別の画面でirssiを起動する、みたいな事を毎回やってた訳ですがいい加減めんどう臭くなってきたので自動化した。 まずscreenを自動起動する仕組みを考えた。rcスクリプトでもいいけど、そもそも共用サーバなのでroot権限が無い。そこでcronを使う。crontab -e して @reboot (. ~/.profile; /usr/bin/screen -d -m)
@reboot という識別を使います。再起動して1回だけ実行されるコマンドが書けます。最近の linux であれば使えるかと思います。
ここで .profile を読み込んでるのは、これをしないと screen が新しく起動するプロセスに対してインタラクティブシェルから起動していたはずの環境変数等を引き継いでくれないから。例えば最近の Ubuntu であれば ~/.bashrc # If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
こんな風にインタラクティブシェルじゃない場合には読み込まない様になっている。編集してもいいんだけど、僕はどの環境でも使えるベストプラクティスを選んだ。
また screen に渡している -d -m、これが無いとコンソールと通信するはずの screen が端末にアクセス出来なくて死ぬ。起動してすぐデタッチしてます。

あとは ~/.screenrc で好きなように画面を割って各プロセスを起動すれば良い。 startup_message off
vbell off
defshell /bin/bash
defscrollback 1000
hardstatus string "%?%H %?[screen %n%?: %t%?] %h"
screen 0 irssi
screen 1 /home/mattn/bin/startup-servers
僕の場合は、goreman というツールでサーバやbotを起動していて、それと irssi で画面分割している。
ちなみに defshell を設定しないと cron から起動した場合は $SHELL が設定されていないので、/bin/sh になってしまうのを回避する為に必要です。
Posted at by