質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • bash

    804questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • シェル

    282questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

apacheプロセス起動数検知処理スクリプトについて

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,941

tk_flavor

score 96

apacheプロセス起動数が指定した値以上である場合に
apache再起動を実施し、apache再起動処理が成功すれば、その内容をメール通知し、メール本文内に
再起動後のapacheプロセス数を表示させるスクリプトを書いています

sh -xでテスト実行を行って問題ない事を
確認してcronに登録しているのですがうまく実行されません

作成したスクリプトでどこか誤っている箇所があるようでしたら
ご指摘頂けますと幸いです

#! /bin/bash

#監視するプロセス名を定義する
PROCESS_NAME=/usr/sbin/httpd

#メールを送信するメールアドレスを指定する
ML_SEND=alert@abc.co.jp

#監視するプロセスが何個起動しているかカウントする
count=`ps -ef | grep $PROCESS_NAME | grep -v grep | wc -l`

#監視するプロセスが256個以上場合に、処理を分岐する
if [ $count -gt 256 ]; then

sudo /etc/init.d/httpd stop; sleep 30; sudo /etc/init.d/httpd start
fi

if [ $? -eq 0 ];then
echo "$PROCESS_NAME is MaxClients and so Apache restart is OK" $PROCESS_NAME is $count | mail -s "$HOSTNAME.com httpd process alert" $ML_SEND
fi

cron登録は下記になります

*/5 * * * * /bin/bash /home/test/sh/httpd_proc_monitor.sh > /dev/null 2>&1

追記したスクリプト

#! /bin/bash

#監視するプロセス名を定義する
PROCESS_NAME=/usr/sbin/httpd

#メールを送信するメールアドレスを指定する
ML_SEND=test@aaa.co.jp

#監視するプロセスが何個起動しているかカウントする
count=`ps -ef | grep $PROCESS_NAME | grep -v grep | wc -l`

#監視するプロセスが270個以上場合に、処理を分岐する
if [ $count -ge 270 ]; then

sudo /etc/init.d/httpd stop; sleep 30; sudo /etc/init.d/httpd start &&  echo "$PROCESS_NAME process is MaxClients and Apache restart is OK" $PROCESS_NAME is $count | mail -s "$HOSTNAME httpd process alert" $ML_SEND

fi
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

Apacheの再起動自体はできているのでしょうか?
パッと見怪しいのは、最後のifブロックの"$?"の使い方です。
これはその手前の"if"コマンドの戻り値を拾ってしまいます。
書き直すならこうでしょうか。

if [ $count -gt 256 ]; then
  sudo /etc/init.d/httpd stop; sleep 30; sudo /etc/init.d/httpd start

  if [ $? -eq 0 ];then
    echo "$PROCESS_NAME is MaxClients and so Apache restart is OK" $PROCESS_NAME is $count | mail -s "$HOSTNAME.donkimall.com httpd process alert" $ML_SEND
  fi
fi

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/06 15:22

    ありがとうございます

    if文処理は1つにして、apache再起動、メール通知処理をコマンドでつなげて
    書いたパターンでのスクリプトで試してみたところ、cron処理でうまく実行されませんでした。
    このパターンにおいては、記述のどこが誤っているのでしょうか
    ご教授頂けますとありがたいです。

    スクリプトは最初の質問に追記しています

    キャンセル

  • 2016/10/06 15:34

    もう他の方からも出ていますが、cron実行による環境変数回りの問題くらいしか思いつかないです。
    スクリプトの1行目を"#!/bin/bash -x"として、(これも既出ですが)標準出力と標準エラー出力をファイルにでもリダイレクトして結果を確認してみてはいかがでしょうか。

    キャンセル

  • 2016/10/06 15:41

    すみません
    crontabに下記を記載しました
    ありがとうございました

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    HOME=/

    キャンセル

  • 2016/10/06 15:47

    記述を追加したのは良いのですが、他に影響が出ませんかね…
    また、記載した後は上手くいったのでしょうか?

    それほど複雑な処理をしている訳でもないですし、シェルスクリプト単体の問題として解決した方がいいような気がします。

    あと追加で一つコメントを。
    私がシェルスクリプトを書くときは、コマンドは全てフルパスで指定します。
    (スクリプト先頭付近に変数化しますが)
    パスが通っていないとか、意図しないalias(たとえば"rm"が"rm -i"とか)に引っかからないためです。

    キャンセル

  • 2016/10/06 15:52

    ご指摘ありがとうございます
    フルパス指定するように心がけます

    キャンセル

0

出力を/dev/nullに捨てずに、エラーメッセージを見るのが第一歩です。

あと、

再起動後のapacheプロセス数を表示させるスクリプトを書いています 

は、「再起動前のapacheプロセス数」の誤りでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/06 14:55

    エラーメッセージを拾えばいいのですね

    再起動後のapacheプロセス起動数です

    キャンセル

  • 2016/10/06 14:59

    > 再起動後のapacheプロセス起動数です

    ということは、質問文のスクリプトを間違えて載せたと言うことですか?
    正しいものに差し替えて下さい。

    キャンセル

  • 2016/10/06 15:46

    apache再起動処理後に、起動されているapacheプロセス数を表示する
    $PROCESS_NAME is $count
    を記載しています

    この内容に不備があるとの事でしょうか

    キャンセル

  • 2016/10/06 16:13

    $countに入ってるのは、再起動前のプロセス数ですが??

    キャンセル

  • 2016/10/06 16:54

    本題に戻って、メッセージはどう出てますか?

    キャンセル

0

質問と異なる回答をします。

再起動する理由はなんでしょうか?
プロセス数を一定数以下にしたいのであれば MPM の設定をしてみたらどうでしょうか。

マルチプロセッシングモジュール (MPM) - Apache HTTP サーバ バージョン 2.4

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/06 15:01

    over MaxClients となれば、アクセス出来ないからです

    MaxRequestsPerChildを減らせばいいという事でしょうか

    キャンセル

  • 2016/10/06 15:14

    プロセスを再起動しても再起動中はアクセスできないですし、アクセス中の場合途中で切断されます。
    途中で切れてもいいような仕組みなら私の回答は役に立たないです。

    MaxRequestsPerChild に関しては MPM のモジュールによると思います。
    prefork なら MaxClients でしょうか。


    キャンセル

  • 2016/10/06 15:30

    回答がよくわからないのですが。。

    MaxClientsはサーバメモリなどを考慮・勘案して決めるはずです

    それを減らしても、イベント時などユーザアクセスは来ると思いますが?
    サーバの上のLBやproxyでアクセス流入数を制限しろって事ですか?

    MaxClientsになっているなら、その際はユーザにとっては真っ白ページかページが見れないですね

    キャンセル

  • 2016/10/06 15:34

    最初の質問に対して答えてるだけなんですが、
    やりたいのはプロセス数の制限なんですよね?

    キャンセル

  • 2016/10/06 15:44

    >MPM のモジュールによると思います。
    prefork なら MaxClients でしょうか。

    こう記載していますね
    MaxClients を減らしても、イベント時などはそれを超えた流入が来ます
    なので apacheエラーログではMaxClients エラーは出ますし
    その時はページ表示も出来ないはずです

    この解釈が違うのでしょうか

    キャンセル

  • 2016/10/06 15:57

    イベント時ってなんだろう・・

    prefork で MaxClients を指定してもそれ以上の子プロセスが起動できるということであれば私の知識が間違っていました。逆に勉強になりました。

    ページが表示できるかどうかは今回の本題にはないと思います。
    再起動してるんだからページ表示させたいんだろうとは思いましたが。

    どうしてもプロセス切るのであれば、全部切るんじゃあなくて、プロセスごとの通信の状況を見て1個ずつ切った方がいいかと思います。

    キャンセル

  • 2016/10/06 18:07

    > tk_flavor
    このやり取りを見ていて私もNOTEPADさんと同様に「再起動する理由」がよく分からないです。

    > over MaxClients となれば、アクセス出来ないからです
    とありますが、結局再起動後に同じことになりませんか?
    それとも苦肉の応急処置ということなのでしょうか?それなら分かりますが。

    キャンセル

0

crontab の実行で失敗する場合で考えられる事として環境変数値の違いの場合があります。
sh -xはログイン環境設定後の実行になりますがcrontabでは異なります。
試しにenvコマンドをcrontabに登録して env > hogefileして比べてみてはどうでしょうか?

sudo辺? PATH?ならコマンドなし

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/06 15:46

    申し訳ありませんでした。

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    HOME=/
    をcrontabに記載しました

    お手数お掛けしました

    キャンセル

同じタグがついた質問を見る

  • bash

    804questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • シェル

    282questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。