cronでログ出力とメール送信を同時にしたい – パイプ リダイレクト tee

 cronでバッチを走らせた場合に良くやるのが、リダイレクトを利用したロギング

0 * * * * /root/test.sh >> /va/log/test.log

みたいにリダイレクトすればtest.shを実行して標準出力の内容をtest.logに追記できる(上書きなら>一個)

 また、出力内容をメールしたい場合には、リダイレクト(>)の代わりにパイプ(|)を使って、

0 * * * * /root/test.sh | mail user@hoge.piyo

みたいにmailコマンドに入力してメールを飛ばす。

 で、本題はロギング(リダイレクト)しつつ、メール送信(パイプ)もしたい場合。
 プログラムの中に何かしら書いてしまえば出来るけど、手を入れずに済ませる場合に使えるのが tee と言うコマンド。
 tee は、入力された情報をファイルに書き込みつつ標準出力にエコーするだけの単純なプログラムだ。

0 * * * * /root/test.sh | tee /var/log/test.log | mail user@hoge.piyo

のように使うと、/var/log/test.log に書き込んで、メールも飛ばせる。

デフォルトで上書きなので、追記したい場合は

0 * * * * /root/test.sh | tee -a /var/log/test.log | mail user@hoge.piyo

のように、-a(append)オプションを付けてやればいい。

 ほんとに単純なコマンドではあるが覚えていると便利である。

(1933)

カテゴリー: サーバ設定 | コメントをどうぞ

wordpressでmeta descriptionをいじる

 色々なSEOパッケージにはMETA DESCRIPTIONをセットする機能があるんだけど、これの動作がGoogle先生に嫌われてしまった。
 具体的には、メインインデックスのDESCRIPTIONと別ページのDESCRIPTIONが同じになっていたんだけど、これが重複判定されて、インデックスの殆どが補足に回されてしまった。
なので、独自にDESCRIPTIONを作る。 header.phpの</head>の手前あたりに設置

<?php
if(isset($_SERVER[‘REDIRECT_URL’])){
if(is_array($posts)){
$local_array = array();
foreach($posts as $local_post){
$local_array[] = $local_post->post_title;
}
echo(“<meta name=’description’ value='”.implode(‘, ‘, $local_array).”‘ />”);
}
}else{
echo(“<meta name=’description’ value=’こちらはServersMan@VPSインデックスのDESCRIPTIONです。’ />”);
}
?>

このコードでは、/に接続されたときには、’こちらはServersMan@VPSインデックスのDESCRIPTIONです。’ を書き出して、それ以外のページの場合には、記事のタイトルをカンマ区切りで列挙するようにしてある。

(74)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

サブクエリを使う場合のパフォーマンス低下 – MySQL サブクエリ IN

 WHERE句でINを使ってサブクエリを構築する場合

SELECT * FROM main_table WHERE id IN (SELECT main_id FROM sub_table WHERE date=’2011-12-21′ GROUP BY main_id) AND type=1

 みたいに書くとパフォーマンスが低下する。
 メインテーブルの条件になるmain_idをグループにすると重複が無くなって良さそうな感じがするんだけど、このGROUP BYをするとインデックス動作が低速化するので、GROUP BY main_idを除去する方が良い。
 サブクエリの戻り値が複数あっても、結局、INを展開するとid=1 OR id=1 OR id=2みたいな事になるんで、JOINした場合と違って論理的に被らないので、こういったグループ化はしない方が良い。
 また、関数を使って値を処理した場合にもインデックスが動作せずにクエリが著しく低下するので、インデックスが動作する形でSELECTして、プログラム側で処理をした方が高速なこともあるのに注意したい。

(125)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

mailコマンドのFromを設定する – from mail submit.cf

さくらVPS(CentOS i386)でデフォルト状態のmailコマンドでメールを送信すると、Fromがuser@ホスト名になる。
しかし、Fromをuser@ドメインにしたいという事がある。
コマンドオプションでFromを指定することも出来るけど、毎回指定するのも面倒なので設定を書き換える。

設定ファイルは /etc/sendmail/submit.cf である。
SMasqSMTPと言う部分で定義してあり、標準では

R$+                    $@ $1 < @ *LOCAL* >             add local qualification

のように記述されている部分。
*LOCAL*の部分がローカルホストに書き換えられる仕組みなので、手っ取り早く設定するなら

R$+                    $@ $1 < @ xn--ockc3f5a.com >             add local qualification

のように書き換えると、mailコマンドにオプション無しで送信すると、userあっとまーくxn--ockc3f5a.comのようになる。

(1019)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

バリュードメインでサブドメインのメール設定したが上手く動かなかった – value-domain サブドメイン dns mx 設定

value-domainでサブドメインのmx(受信サーバ)を設定する場合、説明に従っても動作しなかった。
解説通りであれば、hoge.piyoドメインのサーバで

mx mailhost 10 subdomain

みたいに設定をすれば、user@subdomain.hoge.piyoのMXがmailhost.hoge.piyoになるハズなんだけど動作せず。
この設定をした状態で、

nslookup -type=mx subdomain.hoge.piyo

(subdomain.hoge.piyoのmxレコードをルックアップする)
の結果は

mx = mailhost.mx.subdomain.hoge.piyo

になってしまっていた。
単純に、aポイントでこの長いドメインを向けても良いんだけど、既にあるサーバ名に合わせたいので

mx mailhost.hoge.piyo. 10 subdomain

と言うように、他ドメイン向けとして説明されている、フルドメイン表記で設定すればOK。
ホストのアドレスの最後に.が付いているけど、これは必須(BINDで即値指定する場合は、最後に.を付けるのが作法)

(956)

カテゴリー: サーバ設定 | コメントをどうぞ

yumでパッケージ名がわからない時に欲しいファイル名から探す – yum whatprovides

 Linuxを使っていて、プログラムを起動しようとしたとき

cannot open libhoge.so.3

 とか言われて起動できないことがある。
 共有ライブラリが入っていないから起動できないよと言うエラーであるが、このライブラリが libhoge パッケージに入っているなら

yum install libhoge

 で済むわけだけど、全然違う piyo.noarch とかに入っていると名前から推測できない。
 そんなとき、パッケージが提供してくれるファイル名を探すコマンドがある。

yum whatprovides */libhoge.so.3

 みたいに、whatprovidesと言うコマンドである。
 ワイルドカードで

yum whatprovides */libhoge.*

 みたいな検索も出来る。
 全てyumで管理していると、通常は依存パッケージを自動で入れてくれるけど、パッケージが無くてソースビルドしようとするとライブラリ無いよメッセージは良く発生するので覚えておくと便利だろう。

(306)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

wgetを活用してサイトの生死確認を行う – wget サーバ管理

 以前紹介したwgetコマンドだけど、これがとても便利。
 通常のGET以外にPOSTでデータを送ることも出来る。

例えば、

WORDS=wget -q -O - --post-data 'loginid=hoge@piyo&password=hoo' http://hoge.piyo/login|grep ServersMan@VPSにログインありがとうございます|wc -w
if test $WORDS -gt 0; then
echo ‘HOGEサイトに正常にログインできました。’|mail -s “hoge-service health status[Good]” “ayu@hoge.piyo” — -f “system@hoge.piyo”
else
echo ‘HOGEサイトへのログインテストに失敗しました。
システムに不具合がある可能性があります。’|mail -s “***** hoge-service health status[Bad] *****” “ayu@hoge.piyo” — -f “system@hoge.piyo”
fi

みたいなシェルを作ってcronで回しておく。
 -Oオプションは取得した内容を標準出力する。 –post-dataで、この場合ログインID&パスワードを送信した結果に、特徴文字列(ServersMan@VPSにログインありがとうございます)をgrepで探して、wc -wコマンドで該当文字列の単語数をカウントした結果をWORDS変数に入れている。
 で、if test $WORDS -gt 0(greater than 0=0より大きい)が成立すれば、Goodのメールを送信し、成立しなければBadステータスのメールを送信する。
 Goodの送信をナシにして、Bad時にケータイに送信するような感じにしてcronで毎分回しておくと、サイト不具合を検知しやすいだろう。

(415)

カテゴリー: サーバ設定 | コメントをどうぞ