aramsanのブログ

八方塞がりの年にあえて挑戦し始めるエンジニアリングブログ

meld3のバージョン依存でsupervisordが起動しない!

掲題の通り、supervisordのインストールではまりました。

supervisordからプロセスが起動できない。

 [root@localhost]# supervisorctl
Traceback (most recent call last):
File "/usr/bin/supervisorctl", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
working_set.require(__requires__)
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: meld3>=0.6.5

 うーん、meld3のバージョンを見てみよう

 [root@localhost]# pip list
distribute (0.6.10)
ethtool (0.6)
firstboot (1.110)
gyp (0.1)
iniparse (0.3.1)
meld3 (1.0.2)
pip (7.0.3)
pycurl (7.19.0)
pygpgme (0.1)
python-meh (0.11)
scdate (1.9.60)
setuptools (0.6rc11)
slip (0.2.20)
supervisor (3.1.3)
urlgrabber (3.9.1)
yum-metadata-parser (1.1.2)

 0.65以上なんだけど。

ググってたら、こんなスレを見つけました。

github.com

なるほど。meld3のバージョンを1.0.0に落とすと動くとのこと

[root@localhost]# pip install meld3==1.0.0
Collecting meld3==1.0.0
/usr/lib/python2.6/site-packages/pip-7.0.3-py2.6.egg/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Downloading meld3-1.0.0.tar.gz
Installing collected packages: meld3
Found existing installation: meld3 1.0.2
Uninstalling meld3-1.0.2:
Successfully uninstalled meld3-1.0.2
Running setup.py install for meld3
Successfully installed meld3-1.0.0 

 これで、supervisord起動

[root@localhost ~]# supervisorctl start all
[root@localhost ~]# 

 動いた!

Dokcer + CentOS7 環境で tmpfsを使う

以下の形で作成したDockerのインスタンスでそのままではtmpfsが使えなかったので、メモ。

docker pull centos:latest

docker images centos 

 2015/03/05現在 CentOS7がInstallされる

dockerを動かす

docker run -i -t centos /bin/bash

 tmpfsを作る

 [root@xxxx /]# mount -t tmpfs tmpfs /mnt
mount: permission denied

 permissionが足りないらしい。

Dockerでは権限を追加してやるために、Dockerの起動オプションを追加すればうまくいった。

 docker run --privileged -i -t centos /bin/bash

[root@xxxx /]# mount -t tmpfs temps /mnt

 permission deniedがでなくなった!

[root@cb779990271a /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/docker-xxxx          10190136   251792     9414056 3% /
tmpfs                                              234696             0       234696 0% /dev
shm                                                  65536             0         65536 0% /dev/shm
/dev/mapper/VolGroup-lv_root 201655248 7109996 184295012 4% /etc/hosts
tmpfs                                             234696              0        234696 0% /mnt

 ちゃんとマウントも出来ました。

 

--privileged だと、権限与え過ぎで怖いという方は、SYS_ADMINを付与すると良いようです。

docker run --cap-add=SYS_ADMIN -i -t centos /bin/bash

 

Apacheの設定をAmon2用にしてみた

Amon2を初めてInstallしてみた - aramsanのブログ

で、とりあえずの動作確認として、

curl http://localhost:5000/

 という、ヘボい方法で確認していたので、Apacheで、リバースプロキシの設定をし、ブラウザ上で確認できるようにしてみた。

 

その設定を忘備録代わりにここに残しておく。

Apacheの環境は、 httpd  x86_64 2.4.6-2.fc18

 

必要なモジュールは以下の通り

  • mod_proxy.so
  • mod_proxy_http.so

設定は、/etc/httpd/conf.modules.d/00-proxy.conf にあった

確認してみると、

...

 LoadModule proxy_module modules/mod_proxy.so

...

LoadModule proxy_http_module modules/mod_proxy_http.so

...

最初からEnableされていた。

 

次にリバースプロキシの設定

/etc/httpd/conf/httpd.confに以下を追加した。設定はRoot権限で。

ProxyRequests Off

ProxyPass /MyApp/  http://localhost:5000/

ProxyPassReverse /MyApp/ http://localhost:5000/ 

 

後は、Apacheの設定を読み込ませるだけ

Root権限で

 # systemctl reload httpd.service

するだけ

 

後はブラウザで確認しましょう。

http://localhost/MyApp/

 

これで、Amon2の出力が、ブラウザに表示されるでしょう。

 

Amon2を初めてInstallしてみた

Amon2を使ったことが無かったので、Installしてみた。

 

Installした環境は、FC18。cpanm は yum install済み。

 

早速、Amon2をCpanmでInstallした。rootユーザーで

 

 # cpanm Amon2

ごにょごにょごにょ

Successfully installed Amon2-4.01 

 

インストール成功

一般ユーザーに戻って、Amon2のスケルトン作成

 

amon2-setup.pl MyApp

ごにょごにょごにょ

 

成功した模様。

 

早速起動

cd MyApp

plackup app.psgi

起動せず、Moduleが足りないとエラーが出た

 Can't locate Teng/Schema/Declare.pm in @INC

 

 まあ、明示的にInstallした記憶はないので仕方ない。

ところで、MyAppのルートディレクトリを見たら、cpanfileというファイルが置かれていることに気づく。これで、必要なcpan moduleが管理されていることに気づく。

これは、サービスごとにcpan moduleを管理できるいい方法だと感心した。

ということで、MyApp ディレクトリでcarton installし、cpan Module環境を作りなおした

$ cd MyApp

$ carton install

ごにょごにょごにょ

Complete! Modules were installed into ごにょごにょ

Module Install完了。

carton execを使ってplackupしてみる

$ cd MyApp

$ carton exec -- plackup app.psgi &

HTTP::Server::PSGI: Accepting connections at http://0:5000/

起動成功!

早速実験

$ curl http://localhost:5000/

エラーじゃない何かが表示された。

#ブラウザで見てないのは、リバースプロキシの設定していないので。

 

 

 

 

plenv + cpanm + cartonな環境で、crontabでハマった 続編

[plenv + cpanm + cartonな環境で、crontabでハマった:title]

で書いたことについて、その後進展がありました。

 

もっと簡単な方法で、carton execする方法が見つかりました。

*/1 * * * * plenv /bin/bash -l carton exec -- perl test.pl 

 と、crontabの記載を変えてやると、あっさり動きました。

/bin/bash -l はそのユーザーのログインシェルと同等の動きをしてくれるとのこと。

 

これで、気持ちよく、cronをぶん回せますね。

週間アスキー 2013/9/10号付属のNFC ディスクに書き込んでみた

 

 

前回

週間アスキー 2013/9/10号付属のNFC ディスクを速攻で試してみた - aramsanのブログ

は、読み込みのテストを行なってみましたが、このタグは書き込み可能な状態で配布されていますので、今回は書き込みを行なってみます。

 

今回使用したソフトはこれ。

NFC TagWriter by NXP - Android Apps on Google Play

前回と同じく、NXP社製のNFCタグ書き込みアプリです。

書き込みデバイスにはNexus 7を使用しました。

 

さて、インストールしたら早速起動してみましょう。

f:id:aramsan:20130807003400p:plain

 

「View」を選択すると、以下の画面に遷移します。

f:id:aramsan:20130807003407p:plain

そして、NFCタグをかざしてみましょう。

 

前回と同じようにURLが書かれていると表示されます。

f:id:aramsan:20130807003415p:plain

 

さて、今度は、本題の書き込みに行きます。

最初の画面に戻って頂き、今度は「Create and wirte」を選択してください。

f:id:aramsan:20130807003425p:plain

 

次の画面で、Newを選んでください。

TagWriterでは、電話帳情報を書き込む「Contact」、URLを書き込む「Bookmark」、テキストを書き込む「Plain text」、そして「SMS」の4つの書き込みモードがあります。

今回は、URLを書き込むため、「Bookmark」を選びましょう。

f:id:aramsan:20130807003434p:plain

 

今までにアクセスしたURL一覧が表示されますが、ここは「Create new bookmark」を選んでください。

f:id:aramsan:20130807003442p:plain

 

URLは例えば、「www.google.com」としてみましょう。

そして、最下部にある「Next」ボタンを選択してください。

f:id:aramsan:20130807003454p:plain

 

次の画面で、「Confirm overwrite」にチェックを入れ、「Next」を選択。
この状態で、以下の画面が出るので、タグをかざしてください。

f:id:aramsan:20130807003407p:plain

 

 

すると、タグに書かれている内容が表示されます。

最下部の「Click to comfirm store」を選択すると書き込みが始まります。

f:id:aramsan:20130807003503p:plain

 

書き込みに成功すると、以下の画面が表示されます。

これで、タグの内容が変更されました。

f:id:aramsan:20130807003513p:plain

 

最初の画面に戻り、「Veiw」を選択後、書き換えたタグをかざすと、見事に書き換わった内容が表示されました。

f:id:aramsan:20130807003528p:plain

 

これで、このタグをかざせば、簡単にgoogleのページが見れるようになりました。

plenv + cpanm + cartonな環境で、daemontoolsでハマった

plenv + cpanm + cartonな環境で、crontabでハマった - aramsanのブログ

にて、crontabから、plenv + cpanm + cartonな環境で動かした記事を書き、その文中で、daemontoolsからの起動もそのまま動くと書きました。

 

確かに、一見そのまま動いていました。

 

しかし、サービス化したスクリプトを止めたり動かしたりしていると、次第にレスポンスが悪くなっていき、最後はmysql が too many connectionsのエラーを吐き始めました。

 

そこで、プロセスを確認してみると、動かしたサービス x 再起動数のプロセスができているじゃないですか。一見うまく動いているように見えて、止まることができなくなっていたのです。

 

よくよく、挙動を見てみると、kickしているスクリプトはちゃんと再起動しているが、kickされているスクリプトがみるみるプロセスとして増えていく。

 

このkickスクリプトが、悪さをしていることに気づきました。

 

親プロセスが再起動されても、子プロセスが再起動されないことヒントに、調べてみると、execの有無で挙動が変わることに気づきました。

 

問題が起こるスクリプト

(前略)

carton /home/plenv/exec -- "$1"

問題が起きないスクリプト

(前略)

exec /home/plenv/carton exec -- "$1" 

 execは、子プロセスを作るのではなく、同一プロセスとして、実行するコマンドです。なので、親スクリプトが止められたら、自動的にその先のスクリプトも止められます。

 

これで、問題が解決しました。

 

出来上がった、kickスクリプトを以下に書いておきます。

#!/bin/sh

export HOME=/home/plenv

export PATH="$HOME/.plenv/bin:$PATH"

eval "$(plenv init -)"

cd $HOME

exec carton exec -- "$1" 

 これで、無事daemontoolsからもcrontabからも起動できる、kickスクリプトが完成しました。