- - PR -
awk構文について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-12-08 13:22
こんにちは。 皆様のおかげでようやく完成致しました。
↓完成版(カウンタあり) #!/usr/bin/sh ######################################### pidfile=/usr/local/apache/logs/httpd.pid echo "$pidfile" pid=`cat ${pidfile}` echo "$pid" HTTP_PID_TXT=HTTPDPID.txt ##################################### if [ ! -f "$pidfile" ] then echo "File is not exist" exit 1 fi if [ "$pid" -lt 1 ] then echo "File is not set" exit 2 fi ps -ef | grep http | grep -v grep | awk '{print $2}' > ${HTTP_PID_TXT} NO=`wc -l ${HTTP_PID_TXT} |awk '{print $1}'` NOLINE=`expr ${NO} + 0` CNT=1 while read LINE do if [ ${LINE} -eq $pid ] then echo "${pid}のプロセスが見つかりました" exit 0 fi if [ ${CNT} -eq ${NOLINE} ] then logger -p user.error "プロセスエラーです。プロセス番号$pid " echo "${pid}のプロセスが見つかりません" exit1 fi CNT=`expr ${CNT} + 1` done < ${HTTP_PID_TXT} rm ${HTTP_PID_TXT} ↓改正前(カウンタなし) #!/usr/bin/sh ####変数定義######################### pidfile=/usr/local/apache/logs/httpd.pid echo "$pidfile" pid=`cat ${pidfile}` echo "$pid" HTTP_PID_TXT=HTTPDPID.txt ##################################### if [ ! -f "$pidfile" ] then echo "File is not exist" exit 1 fi if [ "$pid" -lt 1 ] then echo "File is not set" exit 2 fi ps -ef | grep http | grep -v grep | awk '{print $2}' > ${HTTP_PID_TXT} while read LINE do if [ ${LINE} -eq $pid ] then echo "${pid}のプロセスが見つかりました" rm ${HTTP_PID_TXT} exit fi done < ${HTTP_PID_TXT} logger -p user.error "プロセスエラーです。プロセス番号$pid " echo "${pid}のプロセスが見つかりません" exit 3 2番目のようにカウンタを使わない方法も考えたのですが、exitやbreakを使ってもシェルから抜け出る事はできませんでした。 参考として質問なのですが、exitやbreak以外にも途中で抜けるコマンドはあるものでしょうか? | ||||
|
投稿日時: 2004-12-08 14:45
気になったところを挙げます。
(動作は確認していませんので、間違っているかもしれませんが) 1. HTTPDPID.txt をカレントディレクトリに作成するため、 カレントディレクトリに対して書き込み権限がないと、 動作がおかしくなるかも。 -> このファイルは /tmp/ などに生成したほうが無難かも。 2. /usr/local/apache/logs/httpd.pid が存在しないとき、 pid=`cat ${pidfile}` でエラーが出るかも。 -> 「pid=`cat ${pidfile}`」を「if [ ! -f "$pidfile" ] 」の後に実行するとよいかと。 3. このシェルスクリプトを複数同時に実行すると、 HTTPDPID.txt を同時に使うため、動作がおかしくなるかも。 -> ユニークな名称にする。一般にはPID(shやperlなら$$で取得できる)を使う。 4. /usr/local/apache/logs/httpd.pid が存在するが 読み込めないとき、エラーを出せないような。 -> ここまでチェックする必要はないでしょうが。-f 以外に -r も調べるとよいかと。 | ||||
|
投稿日時: 2004-12-08 15:15
ちいにぃ様。
貴重なアドバイスありがとうございます。 完成したと単純に喜んでましたが、まだまだ穴があった事に気づかされました。 4つのご指摘を修正しまして完成版としたいと思います。 ありがとうございます。 | ||||
|
投稿日時: 2004-12-08 15:51
私からも気づいた点を1つだけ。
> if [ "$pid" -lt 1 ] pidファイルが空だったらここでこけてしまいませんか?pidが空の場合は if [ -lt 1 ] と評価されてしまいますよ。
私の環境では問題なく抜けましたよ。 whileの中でデバッグ文を出力させるとどうなるでしょうか? | ||||
|
投稿日時: 2004-12-08 16:55
komey様。いつもありがとうございます。 ↓(-xを使ってデバッグしたものです。) # sh -x http7.pid.sh pidfile=/usr/local/apache/logs/httpd.pid + echo /usr/local/apache/logs/httpd.pid /usr/local/apache/logs/httpd.pid + cat /usr/local/apache/logs/httpd.pid pid=21273 + echo 21273 21273 HTTP_PID_TXT=HTTPDPID.txt + [ ! -f /usr/local/apache/logs/httpd.pid ] + [ 21273 -lt 1 ] + ps -ef + grep http + grep -v grep + awk {print $2} + read LINE + [ 10714 -eq 21273 ] + read LINE + [ 21277 -eq 21273 ] + read LINE + [ 21278 -eq 21273 ] + read LINE + [ 21276 -eq 21273 ] + read LINE + [ 21274 -eq 21273 ] + read LINE + [ 21275 -eq 21273 ] + read LINE + [ 21281 -eq 21273 ] + read LINE + [ 10712 -eq 21273 ] + read LINE + [ 21273 -eq 21273 ] + echo 21273のプロセスが見つかりました 21273のプロセスが見つかりました + rm HTTPDPID.txt + exit 0 + logger -p user.error プロセスエラーです。プロセス番号21273 + echo 21273のプロセスが見つかりません 21273のプロセスが見つかりません + exit 3 # 環境はSolaris8を使っております。 同じシェルでも環境によってはexitで抜けなかったりするのでしょうか? | ||||
|
投稿日時: 2004-12-08 17:27
正常終了の処理をした後にexitコマンドを書いているのに、シェルを終了しない理由が憶測ですが、分かりました。
exitではループを抜ける事ができますが、プログラムの終了をする事はできなくて、 プログラムを終了させる為には、exitコマンドによってかえってきたリターンコードを 判定して終了させないといけないのでは、、、?と思いました。 これなら面倒なカウンタを使わずとも出来そうです。 今度はカウンタを使わないものを完成させたいと思います。 | ||||
|
投稿日時: 2004-12-08 17:37
[ メッセージ編集済み 編集者: コブラ 編集日時 2004-12-08 17:38 ] | ||||
|
投稿日時: 2004-12-08 18:56
コブラ様。
for構文の例を出していただきありがとうございます。 まずはpidデータをファイルに書き出してから、while構文を使ってまわすと いう方法で考えています。 正常終了の時はexit 0でリターンコードを0にしてプログラムを途中で終わらせたいと考えています。↓ if [ ${LINE} -eq $pid ] then echo "${pid}のプロセスが見つかりました" rm ${HTTP_PID_TXT} exit 0 fi if [ $? -eq 0 ] then exit fi このように改正したが、相変わらずプログラムを途中で抜ける事ができません。 おかしい点がありましたらご指摘よろしくお願い致します。 |