- PR -

awk構文について

投稿者投稿内容
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 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以外にも途中で抜けるコマンドはあるものでしょうか?
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 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/10/14
投稿数: 40
投稿日時: 2004-12-08 15:15
ちいにぃ様。

貴重なアドバイスありがとうございます。
完成したと単純に喜んでましたが、まだまだ穴があった事に気づかされました。

4つのご指摘を修正しまして完成版としたいと思います。
ありがとうございます。


komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-12-08 15:51
私からも気づいた点を1つだけ。

> if [ "$pid" -lt 1 ]
pidファイルが空だったらここでこけてしまいませんか?pidが空の場合は
if [ -lt 1 ]
と評価されてしまいますよ。

引用:

2番目のようにカウンタを使わない方法も考えたのですが、exitやbreakを使ってもシェルから抜け出る事はできませんでした。 参考として質問なのですが、exitやbreak以外にも途中で抜けるコマンドはあるものでしょうか?



私の環境では問題なく抜けましたよ。
whileの中でデバッグ文を出力させるとどうなるでしょうか?
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-12-08 16:55
引用:

私の環境では問題なく抜けましたよ。
whileの中でデバッグ文を出力させるとどうなるでしょうか?




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/10/14
投稿数: 40
投稿日時: 2004-12-08 17:27
正常終了の処理をした後にexitコマンドを書いているのに、シェルを終了しない理由が憶測ですが、分かりました。

exitではループを抜ける事ができますが、プログラムの終了をする事はできなくて、
プログラムを終了させる為には、exitコマンドによってかえってきたリターンコードを
判定して終了させないといけないのでは、、、?と思いました。

これなら面倒なカウンタを使わずとも出来そうです。
今度はカウンタを使わないものを完成させたいと思います。

コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-08 17:37
コード:
for i in `ps -ef | grep httpd | awk '{print }' | xargs`

do
echo $i
done




[ メッセージ編集済み 編集者: コブラ 編集日時 2004-12-08 17:38 ]
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 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

このように改正したが、相変わらずプログラムを途中で抜ける事ができません。

おかしい点がありましたらご指摘よろしくお願い致します。

スキルアップ/キャリアアップ(JOB@IT)