- blogs:
- cles::blog
incronでファイルやディレクトリが変更されたときに任意のコマンドを実行する
以前、簡易にディレクトリの同期を行う方法としてlsyncdを使った方法を調べましたが、単純にrsyncするだけではなくてもうちょっと手の込んだ事がやりたくなってきたのでlsyncdと同じinotifyベースで動作するincronをというソフトウェアを試してみました。
ファイル/ディレクトリの変更に応じて任意のジョブを実行するincron - SourceForge.JP Magazine
こうした伝統的なcronで行えるのが時刻指定型のジョブ実行であるのに対して、ファイルシステムの変更を検出して指定のコマンドを実行させるというコンセプトで作られたcronクローンの一種に incron というツールが存在する(正式名称はinotify cron)。incronを使用するための設定としては、どのようなファイル/ディレクトリの変更を監視対象とするかおよび、そこでの変更発生時に実行すべきジョブの登録が必要となる。
以下は作業メモ。
† インストール
ソースからインストールしなければならないかと思いきや、CentOS 5.4ではyumでいけました。
# /etc/init.d/incrond start
crontab -r とやってしまった時の対処法
cronの設定を変えようと crontab -e と打とうとして、間違って crontab -r と打ってしまい、cronの設定が根こそぎぶっ飛んで参りました。
「eとrは隣同士だから不慮の事故ですよ!」という他人の言い訳は以前から良く聞いていて、心の中で「そんなことあるかよ!」と思っていましたが、まさか自分がやってしまうとは思いませんでした。まったく言い訳できません。
仕方が無いので、/var/log/cronの実行ログからcrontabをサルベージするスクリプトを書いてみました。本当は時刻の設定とかも復元できるようにしようかと思ったのですが、まぁそんなにお世話になることもないのでそのあたりは手動で実施するということにします。いちおうリストアップされるようにしました。ユニークに出力しますが、*/5みたいに綺麗に畳んだりできないので出力は結構冗長です。
Usage: cron_salvage [options]
-f, --file CRONLOG cron log file (default: /var/log/cron)
-u, --user USER cron user (default: root)
こんな感じで、対象のログファイルとユーザーが指定できるようにしてみました。
/var/log/cronが読める必要があるので、基本的にはrootユーザーで実行する必要があります。
* * * * * /usr/lib/sa/sa1 1 1
* * * * * ionice -c3 nice -n 19 /opt/apache/htdocs/admin/AWStats69t_Jpn/wwwroot/cgi-bin/awstats.cron > /dev/null 2>&1
* * * * * run-parts /etc/cron.daily
* * * * * run-parts /etc/cron.hourly
* * * * * run-parts /etc/cron.weekly
こんな感じで、crontabが復元されるので、cron.(daily|hourly|weekly)に設定されている部分など、不必要な部分を除いてやればよいと思います。まぁ、対象がrootでなければ余計なものはあまり出てこないと思いますが。
[続きを読む...]shスクリプト内で安全に相対パスを使う
シェルスクリプトでバッチを書いたものの、いざcronに仕掛けたらうまく動かないというパターンはバッチを作った人であれば一度は経験があると思います。基本的には環境変数がセットされていなくて、PATHが通ってなかったというパターンなんかが多いと思いますが、その次に多いのが、スクリプトの内部で相対パスを使っているために、自分でも予期しないうちにカレントディレクトリに依存したスクリプトになってしまっていたというのがあります。いちいち外部のプログラムを絶対PATHで書いていってもいいのですが、それも結構鬱陶しいので、僕はスクリプトの行頭に下記のような2行を追加するようにしています。
scriptdir.sh
SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR
# これ以下に処理を書く
pwd
こうするとカレントディレクトリが何処であっても、スクリプトの置いてあるディレクトリをカレントディレクトリとしてスクリプトを実行できるようになります。ちょっとしたスクリプトにも必ず書いておくようにすると、他人にスクリプトを実行してもらうときも、「###にcdしてから・・・」という説明を省く事ができるので意外と便利です。
/tmp/test
$ ./scriptdir.sh
/tmp/test
$ cd ..
$ pwd
/tmp
$ ./test/scriptdir.sh
$ cd ~
$ pwd
/home/hsur
$ /tmp/test/scriptdir.sh
/tmp/test
Rubyでお手軽MQ
仕事でバッチの多重起動を防止するスクリプトを書いたのですが、これだと後続のバッチがキャンセルされてしまって実行されないので、ジョブをQueueに溜めて逐次実行してくれる仕組みが欲しくなったので、Rubyを使ってMQサーバを書いてみました。
RubyにはQueueクラスがあるので、これを使ってdrbからメッセージを投げ込むようにすれば簡単なMQサーバはすぐにできるのですが、これだとメッセージの永続化機能がないので、不慮の事故でマシンの電源が落ちたりするとそのままメッセージが消滅してしまいます。それだと色々と問題があるので、今回はap4rのバックエンドにも使われている永続化機能を持ったメッセージキューであるreliable-msgを使います。
僕がかつて使っていたIBM MQ Series ( Webshere MQ Series )と比べればおもちゃのようなものですが、ちょっと使う分にはこれで十分です。
[続きを読む...]findでスペースが入っているファイルをまとめて削除する
findで検索したファイルをまとめて削除するときには下記のようにすればよいのですが、ファイル名やディレクトリ名に空白が入っているとうまくいきません。
なので、これまで半角スペースが入っているファイルをまとめて削除したいときには下記のようにしていたんですが、デリミタをヌルキャラクタ(\0)にするfindの-print0オプションとxargsの-0オプションを組み合わせて使うとすっきりかけることが判明。
print "$file"
rm "$file"
done
findはオプションがとにかく多くて、機能のすべて暗記するのは不可能なわけで・・・・print0なんて使い道が分からなかったからこれまで全くのノーマークでした。まさかxargsと組み合わせて使うためのオプションだったとは。
bashで多重起動を防止する
シェルスクリプトで多重起動防止処理が必要になったのでちょっと書いてみました。
BASENAME=`basename $0 .sh`
PID_FILE="$BASENAME.pid"
if [ -f $PID_FILE ]; then
STORED_PID=`cat $PID_FILE`
if (ps -p ${STORED_PID} -o pid= >/dev/null); then
echo "Locked by PID($STORED_PID)"
exit
fi
fi
echo $$ > $PID_FILE
# ここに処理を書く
sleep 10
rm $PID_FILE
判定部分がAtomicじゃないので厳密な意味で排他制御はできていないのですが、今回はそこまで厳密でなくても問題ないのでこれでよしとしました。厳密にやるにはmkdirとか使ってやるほうがいいんでしょうけど。。。。
sshを使うとbashのループが回らない?
sshを使って他のホストのコマンド呼び出しを行うシェルスクリプトを開発していたのですが、自分が意図する動作にならずに色々と試行錯誤をする羽目になったので、同じところではまらないようにメモを残しておきます。
seq 1 5 | while read i ; do
echo $i
ssh host1.example.com 'hostname'
done
今回書いたのは上記のようなスクリプトでhost1.example.com上でhostnameコマンドを実行するというのをループで5回繰り返すものです。
1
host1.example.com
一見何の問題もないように見えるのですが、実際に実行してみると上記のようにループが1回しか実行されず、意図通りに動作しません。初めはループの書き方が悪いのかと思って色々と試行錯誤していたのですが、不思議なことにsshの行をコメントアウトするとループは最後まで回るようになることに気づきました。ループの継続判定はreadがstdinを読み込めるかどうかによって行われているので、ここから導かれる原因はsshによってstdinが自分の意図しないところで読み捨てられているということになります。
[続きを読む...]本当にすぐ使えるダミーsmtpサーバー
以前に3行でできる、テスト用メールサーバという話がありましたが、実際にテストサーバに導入して使おうと思ったら、サーバをリブートしたときでも大丈夫かとか、いろいろと考えなければいけないことが多かったので、init.dに放り込むだけで使えるようなスクリプトを書いてみました。
[続きを読む...]lsyncd ディレクトリのリアルタイムミラーリング
FTPでポツポツと転送されてくるファイルをWindowsのファイルサーバーになるべくリアルタイムにコピーする必要があったのですが、ファイルシステムのリアルタイムミラーリングというとHA用の大艦巨砲なものが多いので、もうちょっとお手軽な感じのソフトはないかなと思って探してみたところ、lsyncdというソフトを見つけました。
Lsyncd uses rsync to synchronize local directories with a remote machine running rsyncd. Lsyncd watches multiple directories trees through inotify. The first step after adding the watches is to rsync all directories with the remote host, and then sync single file by collecting the inotify events. So lsyncd is a light-weight live mirror solution that should be easy to install and use while blending well with your system. See lsyncd --help for detailed command line options.
lsyncdはinotifyを使ってディレクトリを監視し、ディレクトリに変化が合った場合にはrsyncを使ってディレクトリを同期するという動作を行うようです。ファイル転送があると、いちいちrsyncするのでちょっと重いかもしれませんが、ファイルの転送はそんなに頻度が高いわけでもないし、そこまでの信頼性も必要ないので今回はこれで行くことにしました。
インストール自体は下記のコマンドで特に問題なくインストールできました。
make
make install
アーカイブにはinitスクリプトが入っていないのでそのあたりは「リアルタイムミラーリングツール導入(lsyncd rsyncd) - Fedoraで自宅サーバー構築」を参考にしました。設定についてはアーカイブに入っているlsyncd.conf.xmlを/etc/lsyncd.conf.xmlにコピーしたのでその部分については書き換えています。
後は/etc/init.d/lsyncd startでデーモンを起動して、ファイルを送信元に放り込んでみると、リアルタイムに送信先にファイルが同期されます。
変数展開で簡単なcsvを処理する
bashにはいろいろな変数展開*1が用意されているので、移植性を考慮しなくてもいい状況であればこれらを使うとかなり便利なことができます。
test,hoge
foo,bar
aaa,bbb,ccc
たとえば上記のようなcsvファイルがあって、それを処理するような場合にはcutやawkを使ってフィールドを切り出さなければなりませんが、bashの変数展開の${paramete%%word}、${parameter#word}やを使えばそれらを使わずに済ますことができます。
[続きを読む...]sp-20100315220531644595555@cles.net
- PSPエロ自作ゲーム
- Yahoo! - 10/03/15 22:05:26
- windows mobile google 同期
- Dual Diamondの予定表とGoogle Calendarを同期させる
- Yahoo! - 10/03/15 22:04:55
- モンスターハンター2G 悪魔武器 ダウンロード
- Yahoo! - 10/03/15 22:04:25
- PSPバグらせ方
- Yahoo! - 10/03/15 22:03:57
- adobe cs5 発売日
- Photoshop CS5の画像処理がすごスゴい
- Yahoo! - 10/03/15 22:03:44
- モンスターハンター2G 悪魔武器 ダウンロード
- Yahoo! - 10/03/15 22:03:32
- シティハンター dvdラベル
- Yahoo! - 10/03/15 22:03:11
- モンスターハンター2ドス 裏世界動画
- Yahoo! - 10/03/15 22:02:57
- パワポケ12コードフリークぱす
- Yahoo! - 10/03/15 22:02:47
- シティハンター dvdラベル
- Yahoo! - 10/03/15 22:02:45
・検索ワードランキングはこちら
- 時間がたっても変わらないもの (4)
- おめでとうございます (4)
- SourceForge.JPのSubversion... (3)
- 知恵の輪 サターン編 (3)
- 和食 小錦 (3)
- XPathのチートシート (3)
- サーバセットアップ (3)
- .inはインドのccTLDなのか (3)
- Thanks ! 10000 Hit ! (3)
- Waterfallプロセスに返れ? (3)
2 . やっぱりあった!パクれる読書感想文! [7299x]
3 . Echofon for Firefox [6176x]
4 . 急性胃腸炎 [5573x]
5 . 芸能人の本名。 [5515x]
- CD-ROM起動で、HDDを完全消去
- NP_Moblog v1.16
- pinzoro 01/15
- hsur 12/29
- and more...
- 耳がおかしいと思ったら突発..
- baca 01/13
- hsur 01/13
- and more...
★はてな認証APIをつかってログインすることができます。




