Archive for Linux

シェルスクリプトでIPアドレスを求める方法

シェルスクリプト内で自ホストのIPアドレスを利用したいときがあったので、書いてみた。

長くて汚いなぁ。

 % /sbin/ifconfig|grep 'inet addr'|grep -v 127.0.0.1|gawk '{print $2;}' | gawk -F : '{print $2;}'
192.168.100.84
%

Linuxのみで動作します。
もっといい書き方有ったら教えてほしいです。

Read more

コピペでできるiptables

サーバをセットアップするときに、iptablesをコマンドでちゃちゃっと設定したいときのためのメモ。

リモートで実行する際にはお気を付けください。
自己責任でご利用願います。Cent OS 4.6にて動作確認はしてあります。

export PATH=$PATH:/sbin/:/usr/sbin/

# allow access for this setting
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# reset policy
iptables -F

# allow
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp --dport 20        -j ACCEPT
iptables -A INPUT -p tcp --dport 21        -j ACCEPT
iptables -A INPUT -p tcp --dport 80        -j ACCEPT
iptables -A INPUT -p udp --dport 53        -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# back to set input as drop
iptables -P INPUT DROP

# save
/etc/init.d/iptables save

ポート番号からサービス名

Linuxホスト上で、あるポートを占有しているプロセスを調べる方法。

たまにしか使わないけど、重要なのでメモっておきます。

# lsof -i:53

lsof ポート番号

ext3ってinode増えすぎると壊れるくさい

2回経験した。

■1

PVがほどほどにあるサイトで、PHPを使ってページをレンダリングしていた。

PV数が多くなり、PHPのGCの処理が追いつかなくなり、セッションを保存するファイルが消えずにどんどん溜っていった。

→fsckかけたらエラーだらけ。

■2

logrotateの設定をミスって、rotateしたログをrotateするという指数的にファイル数が増える状態になっていた。

設定を間違っているのに気づき、ファイルを消した。その後、logrotateが途中で止まる。logrotate -dしても途中で止まる。CPUはuserレベルで100%使ってた。

→fsckかけたらエラーだらけ。

ext3 ファイルシステム信頼できね。

シェルスクリプトで排他処理

運用サーバで、2分おきにsubversionのupdateを行うシェルスクリプトを動かしています。
今までは、1回のupdateが50秒程度で終了するので、同時実行を防ぐための排他処理をしていませんでした。しかし、サーバの負荷が高かったときは2分以内で終わらない場合があるためスクリプト実行の排他処理をしなければなりません。

Webを調べているとシェルスクリプトでロック用のディレクトリを作ってます。しかし、かっこわるい。。。そこで見つけたのがlockfileというコマンド。このコマンドを使った方がロック取得を失敗したときの挙動を変えられるから便利そうです。(今回の場合は意味無いけど)

以下にコード書いておきます。

#!/bin/sh

LOCKFILE=/tmp/subversion.locked

# try to get lock. With no retry.
lockfile -r 0 $LOCKFILE

# evaluate return code
if [ $? -ne 0 ]; then
  echo "Command aborted"
  exit 1
fi

# do something exclusive command
echo "important command"

# unlock
rm $LOCKFILE

Fatal error: Exception thrown without a stack frame in Unknown on line 0

PHPのsession管理のためにファイルを利用しているとき、そのファイルを保存する場所が読み書きできない場合に発生。

Fatal error: Exception thrown without a stack frame in Unknown on line 0

unixコマンドでgrepの否定条件

-vで指定した正規表現の否定にマッチする。

% grep -v

ヘルプにこう書いてある。

-v, --invert-match        select non-matching lines

複数台で運用しているサーバのアクセスログを1つに統合する

複数台のフロントエンドサーバでapacheが動いている場合を想定します。

その場合、アクセスログが複数のサーバにまたがってしまいます。

こんなかんじ。

  • web-01.access-log.20071130
  • web-02.access-log.20071130
  • web-03.access-log.20071130

webalizerやawstatsといったアクセスログ解析ソフトではこのファイルの状態では解析できない。

なぜなら、webalizerやawstatsのデフォルトでは1つのファイルのみを入力として受け付け、時系列順に記録されていなければならない。

この問題を解決するスクリプトを発見しました。awstatsの中に入っているlogresolvemerge.plというperlスクリプトです。

使い方は超簡単。引数に統合したいファイルを指定して実行すると、標準出力に時系列順にそろったレコードが出力される。

例:

% perl logresolvemerge.pl /path/to/log/*access.log.20071130|more

引数にgz圧縮されたファイルを指定してもちゃんと動きます。至れり尽くせりなスクリプト。

★おまけ情報★
ある日まで、commonフォーマットでアクセスログを取っていて、ある時点からcombinedフォーマットでログを取りだした場合、1つのアクセスログの中に2種類のフォーマットのログが混入してしまう。

そこで見つけたのがこの方法。commonフォーマットをcombinedフォーマットにする方法。
http://www.trisweb.com/archives/2007/02/15/convert-apache-common-logs-to-combined-logs/

3回シェルのコマンドを実行すればできちゃう!CUIはすばらしい。

参照:

http://awstats.sourceforge.net/

Compiling subversion from source distribution.

% ./configure --with-apr=/usr/local/apache2   --with-apr-util=/usr/local/apache2 --with-ssl
% make
# make install

subversion-1.4.5 on linux CentOS 4.4.

【トリビア】GMTとUTC

世の中GMTで回っていると思ってたら大間違い!

この世の中はUTCで 回っているのさ!

詳しい説明:

http://www.asahi-net.or.jp/~hi5k-stu/compt/utc_gmt.htm

 

リンク

自分の他サイト