2010年9月26日日曜日

init.d/とか各ランレベルごとの起動スクリプトについて

前回rep2の話でスタートアップとシャットダウン時に行うスクリプトについて書いた
今回は/etc/init.d/rcを使わずにやる(正式な?)方法で起動時、終了時のスクリプトを実行してみる

まず、Linuxは/etc/inittabの定義に従って、/etc/init.d/rcをランレベルを引数にして実行する。
その後、/etc/rc$runlevel.dの中にあるディレクトリを順番に実行する。$runlevelは0~6の数値
(たとえばrc1.d,rc2.d,rc3.d,rc4.d,rc5.d,rc6.d)
/etc/init.d/rcの中を読めば分かるが、大まかな挙動は以下の通り。

1.現在のランレベルと前回のランレベルを取得する。
2.現在のランレベルに対応するディレクトリのKで始まるスクリプトを探し、前回のランレベルで実行されているなら(頭文字がSで始まるスクリプトが存在しているのなら)それを止める。
3.次に、Sで始まるディレクトリを探し、前回のランレベルで起動していないと判明したらstart、もしくはstopをかける。

ちなみに0,6はstopを引数にしてSから始まるスクリプトを順次実行する。
実行する順番はSもしくはKから始まる次の2桁の数値の若い順。
SとKではKが最初に実行される。

前回のスクリプトをこの方法で実現するなら
下記のようなスクリプトを用意すればOK
init.d/my_script
  rc0.d/K01my_script@
  rc2.d/S99my_script@
  rc6.d/K01my_script@

my_scriptの中身は↓
#! /bin/sh
### BEGIN INIT INFO
#
# Default-Start:     2
# Default-Stop:      0 6
# Short-Description: rep2
### END INIT INFO
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

case "$1" in
  start)
        # rep2 HDD -> memory
        mkdir /dev/shm/rep2mem
        rsync -av --delete /var/www/rep2mem_bk/ /dev/shm/rep2mem/
    ;;
  restart|force-reload)
        # nothing to do
    :
    ;;
  stop)
        #rep2 memory -> HDD
        rsync -av --delete /dev/shm/rep2mem/ /var/www/rep2mem_bk/
    ;;
  *)
    echo "Usage: /etc/init.d/my_script {start|stop}"
    exit 2
    ;;
esac

exit 0
参考リンク
http://d.hatena.ne.jp/Naruhodius/20100923/1285247505
http://www.fulldigit.net/content/view/91/17/
cronで@rebootっていうのも書けたりするらしい

2010年9月19日日曜日

perlのエラーコードを参照したりする

systemの結果コードは$?で参照できる

以下引用
変数 $@, $!, $^E, $? は Perl プログラムの実行中に
発生した、異なる種類のエラー情報を保持します。
変数はエラーを報告した副システムと Perl プロセスとの「距離」
の順番に並んでいます。
これらはそれぞれ、Perl インタプリタ、C ライブラリ、
オペレーティングシステム、外部プログラムによって検出された
エラーに対応しています。

$@ → evalのエラー
@! → システムコールのエラー closeとか
@^E → システムコールでエラーになったときの詳細な内容が格納されているらしい
$? → system終了ステータスとかCloseとかの終了ステータスを保持する

参考リンク
http://www.perldoc.jp/docs/perl/5.10.0/perlvar.pod.pod

こんなmanもあるんだ

man ascii
アスキーコードの表示

man hier
ファイルヒエラルキーの説明

こういうTips的なもの
http://cb.vu/unixtoolbox.xhtml

自宅サーバーとレンタルサーバーでメールの同期を図る

私の環境は以下のようにレンタルサーバーと自宅サーバーそれぞれでメールを受信している
自宅サーバーは24時間動かしているわけではないため、自宅サーバーが電源OFFした場合はDynDNSのドメインのIPアドレスをレンタルサーバーに設定。逆に電源がONになった場合はその逆でドメインのIPを自宅サーバーへ向けるようにする。
つまりDNSを更新して現用系(自宅)と待機系(レンタルサーバー)でスイッチさせている

でその時に問題なるのはレンタルサーバーで受信したメールをどうやってこちらに移すか?
今回はsftpを使って同期する

userが対象のユーザ、hoge.netがレンタルサーバーのアドレスとする
#!/bin/bash

my_maildir=/home/user/Maildir/
{
cat << BAT
lcd ${my_maildir}tmp
-get Maildir/cur/*
-get Maildir/new/*
-rm  Maildir/cur/*
-rm  Maildir/new/*
exit
BAT
} | sftp   -C \
    -b - \
    -oIdentityFile=/home/user/.ssh/dti_id_rsa \
       -oPort=443 \
    user@hoge.net > /dev/null 2>&1

cd ${my_maildir}/tmp
for i in $( ls ); do
 dst=`echo $i | cut -d: -f 1`
 if [ $i != $dst ] ; then
  mv $i $dst
 fi
 chmod a+rw $dst
 mv $dst ${my_maildir}/new
done

適当な解説
・sftpについて
sftpはバッチモードというのがあり、-bで指定してその後に命令の書かれたファイルを指定します。今回は標準入力から読み込むため-を指定。get rmはftpでおなじみのコマンドで、
最初に-がついてるのはエラーになっても続行すると言う意味です。(curなどにファイルが無い場合はエラーとなる)
ここら辺に具体的な説明が書かれていますが、-Pはポート指定では無いなどこちらの環境と少し違う箇所がありました。man sftpで見た方が良いかもしれません。

・Maildirのファイル名について
 命名の規約は下記参考リンクを参照するとして今回はレンタルサーバーにたまっていた物を新着メールとして処理したいので、ファイル名の:(コロン)以降を取り外しています。
ファイル名は以下のような構造になっています
1234567890.ABCDEFGHI123456789.hostname:2,S

1234567890 → UNIX時間
ABCDEFGHI123456789 → メールごとにユニークな識別文字
hostname → ホスト名
:2 → 普通は:2を指定してそれ以降に意味のあるフラグ文字を続ける
,S → この例だと既読の意味 Thunderbird上で捨てると,STとかフラグが追加される

参考にフラグの例を記載
* Flag "P" (passed): 転送とかしたときに付くらしい?
* Flag "R" (replied): そのメッセージに対して返信した場合につく
* Flag "S" (seen): 既読のメッセージ
* Flag "T" (trashed): 削除した場合につく
* Flag "D" (draft): 下書きを意味する
* Flag "F" (flagged): フラグ付きを意味する ThunderbirdだとスターをつけるとFがつく


参考リンク
http://www.dovecot.jp/wiki/MailboxFormat.Maildir.txt
http://cr.yp.to/proto/maildir.html

2010年9月18日土曜日

OpenOfficeでクリップアートを追加する

こちらから
OOOP-accessories-2.6.0.2.oxtをダウンロードした


参考リンク
クリップアートの追加
http://gigazine.net/index.php?/news/comments/20071031_oxygenoffice_professional/

rsyncで双方向同期するには

--updateオプションで古い更新日で新しい更新日のものを上書きしないようにする
--existingですでに受信側にあるファイルのみを対象とします

これを指定してA→B,B→Aという2回rsyncすれば同期できるはず

標準エラー出力のリダイレクト話

標準エラー出力と標準出力を混ぜたいときに使う
この文法
command > hoge 2>&1
なぜ↓の様に書いては駄目なのか解説する
command 2>&1 > hoge ←これはうまく出ない

まず >&1 の意味は標準出力の出力先を指す
つまり標準出力と同じ場所に出したいときにしていする

間違った例だとなぜ標準エラー出力が標準出力に出てしまうか順番に解説
1.リダイレクトを指定しない場合
デフォルトの画面に出力される 
標準出力先:画面
標準エラー出力先:画面

command

2.標準エラー出力先を標準出力と同じに指定
標準出力先は画面なのでエラー出力を同じに指定してもまた画面になる
標準出力先:画面
標準エラー出力先:画面(現在の標準出力先と同じ)

command 2>&1

3.標準出力先を指定
標準出力先をリダイレクトによって指定する
標準出力先:hoge
標準エラー出力先:画面

command 2>&1 > hoge

つまり 2>&1 という指定はその時点の標準エラー出力を参照するため、まだ標準出力先を変更していない内に変更しても意味がないということ


参考リンク
http://www.fireproject.jp/feature/bash/basic/redirect-pipe.html

2010年9月12日日曜日

aptitudeのパッケージ検討の時のコマンド

r → その提案を拒否 (rejectの意味か?)
a → その提案を承認 (acceptの意味か?)
Enter → 詳細に表示



http://dolphin.c.u-tokyo.ac.jp/~nori1/aptitude-ja/ch02s01s02.html

期待のファイルシステムNILFS2

NILFS2

ざっと調べたら以下の特徴があるらしい
・NTTが作ったらしい
・スナップショットが取れる
・パフォーマンスが良い
・まだ不安定かも

Btrfsも期待できるけど当面はこっちを使おうかな
http://www.nilfs.org/ja/index.html
http://www.kotodama.jp/blog/index.php/2008/03/12/nilfs2
http://plaza18.mbn.or.jp/~moriban/linux/FileSystemBenchmarkResults-02.html