ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2013年2月10日日曜日

Scala + Sbtでデーモンを作る方法



サーバーで動作を行うデーモンを、Scalaで書きます。

なお、環境はRHEL系のLinuxで動作を確認しました。それ以外のOSの方は
適宜読み替えてください。

また、ビルドなどはsbtを利用するので、「始めるsbt」などを読んでおくと
いいと思います。

1.Scalaのコードを書く


1.1 参照の追加


sbtを使ってアプリを構成します。今回、ApacheCommonDaemonを利用するので、
build.sbtに次のように参照を追加します。



1.2 Scalaのコードを書く


Daemonインターフェースを継承したクラスを書きます。
今回は次のようにしました。

一応、例外を明示的に投げるように書いておいています。

1.3 実行可能ファイルを作る


sbt-assembkyを使って実行可能なjarファイルを用意しました。
sbt-assemblyについては、こちらの記事を参照してもらえると嬉しいです。

2. jsvcのセットアップ


2.1 ソースコードをダウンロードする

http://commons.apache.org/daemon/download_daemon.cgi

上記のURLから''native-src''をダウンロードします。

ビルド対象のコードはにあります。

2.2 ビルドに必要なライブラリ、ツール群をインストールする。


ApacheCommonDaemonのページによると次のツールが必要とのことです。
  • GNU AutoConf (at least version 2.53)
  • An ANSI-C compliant compiler (GCC is good)
  • GNU Make
  • A Java Platform 2 compliant SDK

yumなどを利用してインストールしましょう。

2.3 ビルド、インストールする



jsvc -help ができることを確認。

3. 起動する


起動スクリプトと終了のスクリプトを記述しました。
デーモンらしく,/etc/rc..d/init.d/以下に保存をすると
いいと思います。

4. 参考にしたWEBページなど

以下のページを参考にしました。
Play framework 2.0でデーモン化する方法
始めるSBT
SBTで実行可能なjarファイルを作る
Apche Commons Daemon

2012年7月23日月曜日

mydns.jpに繋がらなくなった


mydns.jpに繋がらなくなった。


事の発端

先日、mydns.jpからメールが来た。

IPアドレスの通知が10日間確認できません。
※注意
・一週間以上IPアドレスの通知がないと、エラーサイトに誘導します。
・一ヶ月以上ご利用がないと、全てのデータを削除しますのでご注意ください。


ipアドレスの通知は、30分おきにwgetコマンドでログインページにアクセスすることで行なっている。

確かに、mydns.jpのログを見るとアクセス履歴がない。どうやら、サーバーからmydns.jpへの接続がうまく行ってないらしい。


結論

悪さをしていたのは、iptablesだった。一度

/etc/rc,d/init.d/iptables stop


で止めた上で

ping www.mydns.jp


を叩いたら繋がった。一先ず、接続許可リストにwww.mydns.jpを加えて問題解決。しかし、色々と腑に落ちない。

やったこと

まずは、pingを試してみる。

ping www.mydns.jp


は勿論、直接IPアドレスをターゲットにしたりもしたけどどうやら駄目。

次はtraceroute

見事に途中まで行って繋がらなくなっている。

この辺で困る。

routeコマンドでルーティングテーブル眺めたり、/etc/hostsとか/etc/resolver.confを眺めるも特に問題無さそう。

というか、mydns.jpにのみ繋がらない。

この辺で、@masawada君に頼んで彼のtracerouteの結果を見せてもらった。

どうも、mydns.jpの直前までは繋がっているらしい。と言うことはルーティングテーブルやDNSの設定ではないなー

って感じで悩んでて、ふとファイアーウォールかなー?と。

そういう訳で、iptablesの設定を変更してどうにか解決。

原因??


なんで、mydns.jpが弾かれていたのか結局謎。

接続拒否リストに載っていたとかってこともないし、特にブロックする設定にしていたわけでもない。

以前発生した似たような現象で、許可していない場所から、場所へのアクセスを全て弾く設定をしてしまっていたことがあったけど、今回はそういう事もない。

ただ1点気になるのはiptablesの設定ファイルの中に書いた

iptable -A INPUT -t filter -p tcp --syn -j DROP


コレが俺の思っている以上に強力なのではないだろうか。特に設定をしていないtcpパケットは弾くっていう意味で書いているつもりだけど、ぜんぜん違うのでは・・・?

iptables -L


を叩くと

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  jpn.www.mydns.jp     anywhere
ACCEPT     all  --  eu.www.mydns.jp      anywhere
ACCEPT     all  --  usa.www.mydns.jp     anywhere
ACCEPT     all  --  asia.www.mydns.jp    anywhere
ACCEPT     all  --  yoriko.mydns.jp      anywhere
ACCEPT     all  --  yoriko.mydns.jp      anywhere
ACCEPT     all  --  usa.www.mydns.jp     anywhere
ACCEPT     all  --  asia.www.mydns.jp    anywhere
ACCEPT     all  --  www.MyDNS.JP         anywhere
ACCEPT     all  --  eu.www.mydns.jp      anywhere
DROP       all  --  usa.www.mydns.jp     anywhere
DROP       all  --  asia.www.mydns.jp    anywhere
DROP       all  --  www.MyDNS.JP         anywhere
DROP       all  --  eu.www.mydns.jp      anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere            udp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:nnsp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:nnsp

ってなって、mydns.jpをDROPしてるし・・・?わからん・・・。わからんけど、今日は寝る。

2012年6月16日土曜日

エミュレーターの画面を出力するディスプレイの設定

エミュレーターを実行するディスプレイを設定する。

Jenkinsの管理→Global properties
で、環境変数
DISPLAY=:0.0

に設定しておく。

とりあえず、こんだけ。これで、Jenkinsの動いているマシンで、エミュレーターを表示できる。


ローカルのマシンで、xhostを立ちあげてそこで表示できるようにしようかなとも思ったけど、常にxhost立ち上がっている訳でもないし、たぶんそれはやりすぎ。

確認したい時だけ、確認できるようになっていれば良いと思う。それが、Jenkinsの目指す所であるはずだし。

X Window System の設定は色々と面倒くさい。

Jenkinsを一般ユーザーで動かす

LinuxでJenkinsを動かすと、ユーザー jenkins が作成され、専用のホームディレクトリなどが生成されてその上で動作をする。

Linuxのデーモン達と同じ様な感じ。

ただ、今回は一般ユーザー numanuma08 で動作をさせたいと思う。

その目的は、Androidのエミュレーターの実行画面を見たいから。

ユーザー jenkins を一般ユーザーにするのもアリかもしれないけど、 なんかイヤなので。

以下、手順

/etc/sysconfig/jenkins の設定

JENKINS_USER="numanuma08"
JENKINS_PORT="8010"
JENKINS_ARGS="--prefix=/jenkins"


/etc/httpd/conf.d/jenkins.conf の設定


Order allow,deny
Allow from all
ProxyPass http://localhost:8010/jenkins
ProxyPassReverse http://localhost:8010/jenkins



パーミッションの変更

chown -R numanuma08 /var/lib/jenkins
chown -R numanuma08 /var/log/jenkins
chown -R numanuma08 /var/cache/jenkins

パスを通す

AndroidSDK


Jenkinsの管理→Global properties

からパスを通す必用あり。

Ant


自動インストールを選択しても実行されなかった。Antのパスを指定する必要あり。

一般ユーザーで動かしているからだろうか、様々な不具合が目に付く。

プラグイン関連がもう、火を拭きまくっていてヤバイ。

明日に続く。

2012年3月18日日曜日

[シェルスクリプト]デバッグを使ってコーデング[cygwin]





昨日の続きで、シェルスクリプトのデバッグ機能を利用してコードを書く。

今回やろうとしているのは、dfコマンドで取得したハードディスクの使用率が80%を超えている物を出力しようと言う物。

最初に書いたコードは以下

 #!/bin/sh

df | while read target; do
         usage=`echo $target | awk '$1 ~ /:$/ {print $5;}' | sed s/%//g`
         if [ $usage -ge 70 ]; then
                 volume=`echo $target | awk '{print $1;}'`
                 echo $volume is used $usage %...
         fi
done


4行目のawkで、Windowsのパーティションの情報のみを正規表現で得ている、つもり、なのだがうまく動いていない。

ちなみに、dfコマンドの出力結果は


\ファイルシス   1K-ブロック      使用    使用可 使用% マウント位置
E:/cygwin/bin     74035520  33040348  40995172   45% /usr/bin
E:/cygwin/lib     74035520  33040348  40995172   45% /usr/lib
E:/cygwin         74035520  33040348  40995172   45% /
C:               167132192 117595092  49537100   71% /cygdrive/c
D:               732555928 386095748 346460180   53% /cygdrive/d
E:                74035520  33040348  40995172   45% /cygdrive/e
F:                51705168    292732  51412436    1% /cygdrive/f
G:               472576040  76612632 395963408   17% /cygdrive/g
H:               594027440 184795676 409231764   32% /cygdrive/h
I:               594035472  93392484 500642988   16% /cygdrive/i
J:               732563992 414357640 318206352   57% /cygdrive/j
K:               488391676 368850304 119541372   76% /cygdrive/k
L:                 6918814   6918814         0  100% /cygdrive/l
Y:               356670332 102977136 253693196   29% /cygdrive/y


こんな感じ。1フィールド目が : で終わるもののみを取得している、つもり。うーん・・・

こういうことも

sh -x

で分かる。上記のコードを実行すると


+ df
+ read target
++ echo $'\203t\203@\203C\203\213\203V\203X' $'1K-\203u\203\215\203b\203N' $'\216g\227p' $'\216g\227p\211\302' $'\216g\227p%' 'マウント位置'
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo E:/cygwin/bin 74035520 33040348 40995172 45% /usr/bin
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo E:/cygwin/lib 74035520 33040348 40995172 45% /usr/lib
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo E:/cygwin 74035520 33040348 40995172 45% /
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=
+ '[' -ge 80 ']'
hdd_checker.sh: line 5: [: -ge: unary operator expected
+ read target
++ echo C: 167132192 117588328 49543864 71% /cygdrive/c
++ awk '$1 ~ /:$/ {print $5;}'
++ sed s/%//g
+ usage=71


変数$usageの中に適切な値が入っていないので、if文で怒られているわけだ。と、まあここまで書いて気づいたけど、awkは確かに処理をしていない。

というか、処理をしていないからこそ、usage変数に何も入らなくなってifで怒られている。

どうすれば良いのか・・・

ちなみに今回の場合、目的を達成するだけであればawkのみを利用して

#!/bin/sh

df | awk '$1 ~ /:$/ {sub(/%/,"",$5); if($5+0 >= 70) print $1 " is used " $5"%"}'


そんな、目的と手段を見失った日曜の午前中・・・。

シェルスクリプトでデバッグ

USP友の会 なる組織があることを初めて知りました。

以前書いた、VMwareEsxiのバックアップスクリプトの動きがおかしかった。

コメントアウトをしたり、色々と調べた結果、スナップショットの作成時点でコケていた模様。

#vim-cmd vmsvc/getallvms

で、全ての仮想マシンの名前やIDを得ることができる。スナップショットを作るための

#vim-cmd vmsvc/snapshot.create

は引数に仮想マシンのIDをとるので、awkを使って

vim-cmd vmsvc/getallvms | awk '/$1/ {print $1;}'

で、ID部分のみを取得できる、はずだった。

しかし、動かない。awkの文法で何かをミスっているらしい。

結論から言うと

vim-cmd vmsvc/getallvms | awk '/'$1'/ {print $1;}'

が正解。標準入力からの引数を文字として認識してしまっていたらしい。

で、調査方法だけどUSP友の会の会長さん(@usptomo)さんが拾ってくれた

sh -vx

こんなのあったんだな。


っていうか シェル デバッグ で検索すると沢山引っかかる・・・検索方法が悪かったですorz

2012年2月12日日曜日

【使ってみた】ComiceOSをインストール【Mac風】


 何となく気になったので、ComiceOSをVMWarePlayerにインストールしてみた。

設定は、大雑把に
メモリ 4GB
プロセッサのコア数 2
ネットワークアダプタ ブリッジ

さて、早速起動・・・と思ったら、起動中にフリーズしている様子。

慌てず騒がずCtrL+Alt+F1でターミナルを立ち上げて、ログイン。
startxコマンドで、X Windows Systemを起動する
$startxで起動。

多分、仮想マシンで立ち上げているから起きる問題だとは思う。

紹介元にもあるように、UbuntuをベースにしたOS。というか、Xは前のGnomeをベースにDocを追加したり、アイコンを変えたと言う物。
アイコンもMacOSX風(というかそのまま)

Launchpadも再現


面白いのは、AppStoreを模したPearStoreを持っている点だろうか。と言うか、アイコンがそのまんまだけど大丈夫か?

これがPearStoreだ!!ほしいアプリを選んでInstallをクリックするだけ

現在のバージョンでは、それだけとしか言いようが無い。

例えば、Applicationディレクトリからゴミ箱に捨てる方法でアンインストールはできない。

消せないEmacs


というか、中途半端にGNOMEなので逆に困る。つい、右上にシステムのセッティング関連のアイコンが並んでいる気がしてしまう。

仮想デスクトップも使えないっぽい(多分)。一つのデスクトップをターミナル専用にするのが好みなんだが、それも許されないのか。

格好良さで言えば、オリジナルのGnomeShellの方が格好いいんでは? と思えなくもない。

しかし、現状で最新のUbuntu11.10で動くソフトウェアが動くと言った使い勝手の良さはいいと思う。

Mac環境の無いユーザに勧めることはできないけど、一風変わったUIで他人に差を付けたいLinuxユーザが使うのは有りか。

面白そうなので、フォーラムを除いてみてプロジェクトに貢献したい。

ところで、最近ReactOSもアップデートされた記憶がある。そっちも使ってみよう。

2012年1月12日木曜日

timeコマンドをパイプでつなぐ

Linuxのtimeコマンドをパイプとかで繋ぎたいんだよって、話。

time ls -la | grep sys

じゃ、だめです。timeは、標準エラー出力なんだ。そこで

time ls -la 2>&1 | grep sys

でも、だめなんだ。
timeの出力をリダイレクト

を、見るまで知らなかったパイプの仕様。

>1行全て実行した後に時間が出力されるの

とのこと。そこで

(time ls -la ) 2>&1 | grep sys

とするのが正解。

覚えておいて損は無いね。

2012年1月7日土曜日

Windowsタスクスケジューラとシェルスクリプトを使って、サーバーのバックアップを自動化したい

この記事を読んだ。

>PCのバックアップやデフラグなど、ソフト側でスケジュール化できるものは自動化を優先し

あー、やっぱりバックアップは自動化するべきなんだなぁ・・・。

家のサーバーのバックアップは手動で

1. VMWareESXi上で、仮想ハードディスクをコピー

2. サブマシンにコピー

3. 外付けハードディスクにコピー

を行なっている。基本的に週一で、土曜日に行う。

手動で、しかもサブマシンはLAN外には公開していないので外出時にはバックアップを取ることができないといえば、できない。

ちょっと、問題には思っていた。

という訳で、バックアップ処理の自動化を行うべくスクリプトを書く。

今回は、Cygwin上でSSHのリモートコマンドを実行し、最終的にサブマシンにコピーする部分までを一気に行う。

外付けハードディスクは、実は常時通電をしておらず、バックアップの時のみ手動で電源を入れている。この作業の自動化は今回は見送る。

と言うか、無理なんじゃないだろうか・・・?

これが、今回用意したスクリプト
backup.sh

backup.sh
#!/bin/sh

USER_NAME=user_name
HOST_NAME=host_name_OR_ip_adress
BACKUP_CMD=vmfs/volumes/DateStore1/backup.sh

TARGETS="Server1 Server2"

STORE_DIR=/cygdrive/G

delete_old_data(){
        ssh $USER_NAME@$HOST_NAME rm -rf /vmfs/volumes/DateStore2/*
}

delete_old_data

for target in $TARGETS; do
        ssh $USER_NAME@$HOST_NAME $BACKUP_CMD $target
done

scp $USER_NAME@$HOST_NAME:~/vmfs/volumes/DateStore2/* $STORE_DIR

delete_old_data


ま、これだけですね。
$BACKUP_CMDは事前に用意したVMWareESXiで仮想ハードディスクをコピーするためのコマンド。このサイトを参考に作った。

ちなみに、参考サイトではCRONを使って自動化を行なっている。というのも、別のNFS別のサーバーにコピーしたファイルを転送しているため。

今回は、サブマシンがWindowsなのでその手段がとれない(できるけど、面倒くさい)。

Winndowsと言うことで、自動化はタスクスケジューラを使う。

コントロールパネル→管理ツール→タスクスケジューラ

”基本タスクの作成”

から、名前と説明を入力し

トリガー:毎週
    毎週:開始日、間隔、曜日を設定。

操作:プログラムの実行
    プログラムの開始:sh.exeのパスをプログラム/スクリプトに、さっき書いたスクリプトのパスを、引数の追加(オプションん)に入力。
   
これで完了ですね。

設定が正しいかどうかは、追加したタスクを選択して実行をクリックする。

これで、バックアップも自動で行えるようになりました。

あとは、アップデートかなぁ・・・?サーバーたちのアップデートは毎晩行うように設定してありますが、Windowsマシンはどうでもないので。

これは、大したことでもないでしょうね。