- PR -

awk構文について

投稿者投稿内容
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-11-26 20:00
こんばんは。

多数の方から多数の貴重なアドバイス大変ありがとうございます。
私としましてもみなさまのアドバイスの通りにシェルの変更を考えている最中です。

ただ私の未熟なレベルではすぐに書き直してこの掲示板にフィードバックする事ができません。
皆様のアドバイスを理解して考えて掲示板に貼り付けるまでに時間がかかりますのでそのあたり
をご了承くださいますようお願い申し上げます。

かならず人様が見れるものに近づけますのでよろしくお願い致します。
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-11-26 20:04
引用:

ビギナーさんの書き込み (2004-11-26 19:48) より:

繰り返しをさせたい理由なのですが、pid=`cat /usr/local/apache/logs/httpd.pid`
を実行させますと1つだけの結果がでます。

ところが ps -ef | grep http | grep -v grep
を実行させますと複数の結果が表示されます。

複数の結果が表示されるという事は2列目が複数あることになります。
正常なプロセスとそうでないプロセスを1つずつ判断するために繰り返し処理が必要だと思いました。



せっかくgrepしているので、もう一回PIDでgrepをかけてみてはいかがでしょうか。
ほろりんさんに回答した通り、httpd.pidに333というのが書かれていた場合、33344や43334、44333などにマッチしないように注意する必要がありますが。

・・・と書くつもりだったのですが心配になったのでお聞きします。

# ps -ef | grep http | grep -v grep
の結果が「正常なプロセスとそうでないプロセス」と表現されていますが、大抵の場合、どれも正常なプロセスですが、その認識は合っていますか。親httpdは子httpdを作成するためです。
おそらく親httpdはrootないしはapache専用ユーザ以外で実行されているでしょうから、プロセスのオーナーがapache専用ユーザ以外のものが親httpdであり、httpd.pidに書かれているプロセスIDを持ちます。
このhttpdからフォークされているhttpdが子httpdであり、3列目がhttpd.pidに書かれているプロセスIDになっているかと思います。

また、Linuxではプロセスだけではなくスレッドもあたかもプロセスかのように見えるので、山のようにhttpdが見えたりするわけですが・・・・・・。

ちなみに私の環境を書いておくと、、、

root 23435 1 0 Nov17 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26768 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26769 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26770 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26771 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26772 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26773 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26774 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26775 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 3447 23435 0 Nov25 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 3449 23435 0 Nov25 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4396 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4398 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4399 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4402 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4403 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4404 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4405 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4410 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4411 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4412 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY

なのですが、どれも正常なプロセス(のはず)です。


さて、この辺りの認識はいかがでしょうか?
# awkとは全く関係ありませんが・・・・・・・。


[ メッセージ編集済み 編集者: komey 編集日時 2004-11-26 20:07 ]
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-11-26 20:21
引用:

komeyさんの書き込み (2004-11-26 20:04) より:
引用:

ビギナーさんの書き込み (2004-11-26 19:48) より:

繰り返しをさせたい理由なのですが、pid=`cat /usr/local/apache/logs/httpd.pid`
を実行させますと1つだけの結果がでます。

ところが ps -ef | grep http | grep -v grep
を実行させますと複数の結果が表示されます。

複数の結果が表示されるという事は2列目が複数あることになります。
正常なプロセスとそうでないプロセスを1つずつ判断するために繰り返し処理が必要だと思いました。



せっかくgrepしているので、もう一回PIDでgrepをかけてみてはいかがでしょうか。
ほろりんさんに回答した通り、httpd.pidに333というのが書かれていた場合、33344や43334、44333などにマッチしないように注意する必要がありますが。

・・・と書くつもりだったのですが心配になったのでお聞きします。

# ps -ef | grep http | grep -v grep
の結果が「正常なプロセスとそうでないプロセス」と表現されていますが、大抵の場合、どれも正常なプロセスですが、その認識は合っていますか。親httpdは子httpdを作成するためです。
おそらく親httpdはrootないしはapache専用ユーザ以外で実行されているでしょうから、プロセスのオーナーがapache専用ユーザ以外のものが親httpdであり、httpd.pidに書かれているプロセスIDを持ちます。
このhttpdからフォークされているhttpdが子httpdであり、3列目がhttpd.pidに書かれているプロセスIDになっているかと思います。

また、Linuxではプロセスだけではなくスレッドもあたかもプロセスかのように見えるので、山のようにhttpdが見えたりするわけですが・・・・・・。

ちなみに私の環境を書いておくと、、、

root 23435 1 0 Nov17 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26768 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26769 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26770 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26771 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26772 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26773 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26774 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 26775 23435 0 Nov21 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 3447 23435 0 Nov25 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 3449 23435 0 Nov25 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4396 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4398 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4399 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4402 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4403 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4404 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4405 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4410 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4411 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY
apache 4412 23435 0 14:40 ? 00:00:00 /usr/sbin/httpd -DHAVE_PROXY

なのですが、どれも正常なプロセス(のはず)です。


さて、この辺りの認識はいかがでしょうか?
# awkとは全く関係ありませんが・・・・・・・。


[ メッセージ編集済み 編集者: komey 編集日時 2004-11-26 20:07 ]



komey様

丁寧な質問に恐縮いたします。
私の文章の書き方が間違っておりました。
正常なプロセスかそうでないプロセスかどうかの判断をする為のシェルではなく
`cat /usr/local/apache/logs/httpd.pid`
の中にある値と比べて同じかどうかを判断するシェルでございます。

皆々様にはわたくしの未熟なレベルのせいでイライラさせてしまい申し訳ございません。

繰り返して申し訳ございませんが、皆様のアドバイスのとおりに変更していく覚悟です。
皆様のおっしゃる事を理解して反映させるまで時間がかかりますが、よろしくお願い致します。





komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-11-26 21:37
引用:

正常なプロセスかそうでないプロセスかどうかの判断をする為のシェルではなく
`cat /usr/local/apache/logs/httpd.pid`
の中にある値と比べて同じかどうかを判断するシェルでございます。



わかりました。では、次の質問です。
ある1行のhttpdのPIDとhttpd.pidのPIDが一致しなくてもそれはNGではなく、全てのhttpdのPIDと一致しない場合がNGである、ということで良いでしょうか。
であれば、PIDでgrepした結果があればOK、結果がなければNGということでも良いのでは?

[ メッセージ編集済み 編集者: komey 編集日時 2004-11-26 21:38 ]
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-11-29 13:32
こんにちは。

komey様のご質問に答える為にはまだ勉強が必要ですので明日の夕方まで
お待ちいただけないでしょうか?

今考えてますのが、リダイレクションのコマンドをつかいawkで抜き出した$2の中身をファイルに書き込みます。

そしてwhile文を使って1行1行読み込ませ、if文で判定をさせようと作っております。
またきりのよいところで途中経過報告をいたします。
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-11-29 13:47
引用:

ビギナーさんの書き込み (2004-11-29 13:32) より:

komey様のご質問に答える為にはまだ勉強が必要ですので明日の夕方まで
お待ちいただけないでしょうか?



すみません、混乱させてしまったようです。
ps -efの結果が前述の私の例の通りとした場合、スクリプトを1回実行した際にビギナーさんが期待する動作というのは、
・OKかNGかが1行出力されること
なのか、それとも、
・OKが1行とNGが20行出力されること
なのか、をお聞きしたいだけです。

私は前者なのでは?と思ったので、ループを使って1つずつ判定するのではなく、grepやawkで抽出した結果を、もう一度PIDでgrepし、結果があればOK、結果がなければNGとすれば良い、と書いた次第です。
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2004-11-29 14:05
ps -efの結果が前述の私の例の通りとした場合、スクリプトを1回実行した際にビギナーさんが期待する動作というのは、
・OKかNGかが1行出力されること
なのか、それとも、
・OKが1行とNGが20行出力されること
なのか、をお聞きしたいだけです。

私は前者なのでは?と思ったので、ループを使って1つずつ判定するのではなく、grepやawkで抽出した結果を、もう一度PIDでgrepし、結果があればOK、結果がなければNGとすれば良い、と書いた次第です。

[/quote]

親切な質問ありがとうございます。おっしゃっている意味が理解できました。

私が考えている方は後者です。
OKが一行と残りはすべてNGとしてエラー出力を考えています。

私の環境でコマンドを実行したものです。
     ↓

# ps -ef | grep http
nobody 10908 10868 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
nobody 10873 10868 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
root 10868 1 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
nobody 10872 10868 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
nobody 10871 10868 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
nobody 10870 10868 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
nobody 10869 10868 0 11月 24 ? 0:00 /usr/local/apache/bin/httpd -DSSL
root 29682 22182 0 13:53:34 pts/1 0:00 grep http

# cat /usr/local/apache/logs/httpd.pid
10868
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-11-29 16:03
引用:

ビギナーさんの書き込み (2004-11-29 14:05) より:

私が考えている方は後者です。
OKが一行と残りはすべてNGとしてエラー出力を考えています。



なるほど、それで会話がかみ合わなかったわけですね。
確かにそれであればループをまわすのが普通ですね。
# 全て正常なプロセスであるにも関わらずOKとNGを出力したい、ということに少し違和感を覚えますが。。。。汗

がんばってください。

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