- PR -

awk構文について

投稿者投稿内容
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-11-29 21:59
gawk(GNU awk)を使うと仮定すると、
httpd.pidはシェルスクリプト側で読み込み、
ps -ef もシェルスクリプト側で実行し、それをgawkにパイプで渡す場合だと、
大筋では次のようになるかと:

#!/bin/sh
ps -ef | gawk -v root_pid=`cat /var/run/httpd.pid` '
BEGIN {
if (root_pid == 0) {
print "httpd is not exist"
exit 1;
}
}
$6 ~ /httpd/ {
if ($2 == root_pid) print $2 " OK"
# else if ($3 == root_pid) print $2 " OK (parent pid=" $3 ")"
else print $2 " NG (" $6 ")"
}'

すべてgawkでやるなら、BEGIN{} 内で、while内でgetlineを使って読み込み、
最後にfcloseしてやります。コード全体は示しませんが、ループは次のように
なります。

cmd = "ps -ef"
while (cmd | getline) {
' ここに行ごとの処理を入れる。
}
fclose(cmd);

こういった処理はプログラミング言語AWKに載ってます。古い本(1989年)なので、
最近の事情(gawkやPOSIX準拠)は載っていないと思いますので、
必要に応じてman gawkを参照のこと。


[ メッセージ編集済み 編集者: ちいにぃ 編集日時 2004-11-30 06:53 ]
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-11-30 08:47
なるほど、それで会話がかみ合わなかったわけですね。
確かにそれであればループをまわすのが普通ですね。
# 全て正常なプロセスであるにも関わらずOKとNGを出力したい、ということに少し違和感を覚えますが。。。。汗

がんばってください。
[/quote]

ありがとうございます。違和感のあるプログラムになりますがビギナーなりに頑張りたいと思い
ます。


ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-11-30 09:10
こういった処理はプログラミング言語AWKに載ってます。古い本(1989年)なので、
最近の事情(gawkやPOSIX準拠)は載っていないと思いますので、
必要に応じてman gawkを参照のこと。


[ メッセージ編集済み 編集者: ちいにぃ 編集日時 2004-11-30 06:53 ]
[/quote]

gawkを使った例のソースを掲示してくださり大変ありがとうございます。
すごく参考になりました。

今私が使っている参考書はソフトバンクパブリッシングが発行した
「入門シェルプログラミング改訂版第2版」です。
もっとawkに対して知識を深めたいと思います。

今作成中のものはsh構文をメインにしたプログラムですが
ちいにぃ様が解説をしてくださった方法でも作成したいと思います。

ご教授大変ありがとうございます。
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-12-07 09:55
おはようございます。
数日経ちましたが途中経過報告でございます。

まずは基本のsh構文を多く使ったシェルを考えてます。
下記のように作成しましたが、例外処理の所で、file is not read となりexit1で抜けてしまいます。

他にもおかしい点や疑問な点がありましたらご指摘をよろしくお願い致します。





# cat http7.pid.sh
#!/usr/bin/sh

####変数定義#########################

pid=`cat /usr/local/apache/logs/httpd.pid`


#####################################

echo "$pid"

if [ ! -f "$pid" ]
then
echo "File is not read"
exit 1
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}のプロセスが見つかりました"
exit 0
fi

done < ${HTTP_PID_TXT}

logger -p user.error "プロセスエラーです。プロセス番号$pid "
echo "${pid}のプロセスが見つかりません"
exit 1



rm ${HTTP_PID_TXT}

#
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-12-07 10:47
引用:

ビギナーさんの書き込み (2004-12-07 09:55) より:

まずは基本のsh構文を多く使ったシェルを考えてます。
下記のように作成しましたが、例外処理の所で、file is not read となりexit1で抜けてしまいます。



これは、if文の判定で-fを使っているためです。-fは、ファイルがあるかどうかを判定するので、ファイル名が与えられる必要があります。つまり、pidの中身が12345だったとすると、カレントディレクトリに12345というファイルがあるかどうかを判定するものです。
では、何を使うかですが、man testで調べてみてください。

例外処理としては、pidファイルがあるかどうか、pidファイルに値が書き込まれているかどうかあたりをチェックしておけば良いと思います。
※実際の運用中にこの例外処理をした場合、どちらが原因なのかをはっきりさせるため、上記は分けて検知した方が良いと思います。

また、
rm ${HTTP_PID_TXT}
は実行されないので、消してもかまわない(次回は上書きされる)ですし、消すのであればexitの前に持ってくる必要があります。

このスクリプトは処理結果をechoで標準出力に出力されていますが、cronなどで自動実行してファイルに結果を出力したりするでしょうか。であれば、Dateコマンドで日付も出力することをおすすめします。


・・・とまあ色々書きましたが、メインの流れは完成しているので、あとは使い勝手を良くするためにひと工夫するぐらいですね。お疲れ様でした。


あと、結局このシェルで期待する動作というのは、
・OKかNGかが1行出力されること
になっていますが、問題ないでしょうか。

ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-12-07 11:10
分かりやすく丁寧なご指摘ありがとうございます。
初心者のわたくしでもどの場所がどのようにおかしいのか理解する事ができました。

まずはご指摘をうけました点を改善したいと思います。

そして次の段階でcronを使って自動実行できるようにしたいと思います。
cronの事まで教えてくださりありがとうございます。

調べていくうちにOKかNGが1行出力されればよいことに気づきました。
調べる前までは全てのプロセスでOKかNGを出さなければと考えてましたが、
ようやくその考えが間違っている事に気づきました。

アドバイス大変ありがとうございます。
改正をしまして、また中間報告をいたします。

ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-12-07 13:31
修正致しました。まだ改善点がありそうな予感がいたしますのでもう少し考えてみたいと思い
ます。ご指摘ありがとうございます。

#!/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" -z 0 ]
then
echo "File is not set"
exit 2

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 0
fi

done < ${HTTP_PID_TXT}

logger -p user.error "プロセスエラーです。プロセス番号$pid "
echo "${pid}のプロセスが見つかりません"
rm ${HTTP_PID_TXT}
exit 3


ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-12-07 13:42
修正致しました。まだ改善点がありそうですのでもう少し考えてみたいと思います。
ご指摘ありがとうございます。



#!/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" -z 0 ]
then
echo "File is not set"
exit 2

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 0
fi

done < ${HTTP_PID_TXT}

logger -p user.error "プロセスエラーです。プロセス番号$pid "
echo "${pid}のプロセスが見つかりません"
rm ${HTTP_PID_TXT}
exit 3


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