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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

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

シェル

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

Q&A

4回答

4692閲覧

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

tk_flavor

総合スコア104

bash

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

シェル

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

0グッド

0クリップ

投稿2016/10/06 04:48

編集2016/10/06 06:25

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

投稿2016/10/06 06:13

編集2016/10/06 06:19
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tk_flavor

2016/10/06 06:46

申し訳ありませんでした。 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin HOME=/ をcrontabに記載しました お手数お掛けしました
guest

0

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

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

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

投稿2016/10/06 05:11

NOTEPAD

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tk_flavor

2016/10/06 06:01

over MaxClients となれば、アクセス出来ないからです MaxRequestsPerChildを減らせばいいという事でしょうか
NOTEPAD

2016/10/06 06:14

プロセスを再起動しても再起動中はアクセスできないですし、アクセス中の場合途中で切断されます。 途中で切れてもいいような仕組みなら私の回答は役に立たないです。 MaxRequestsPerChild に関しては MPM のモジュールによると思います。 prefork なら MaxClients でしょうか。
tk_flavor

2016/10/06 06:30

回答がよくわからないのですが。。 MaxClientsはサーバメモリなどを考慮・勘案して決めるはずです それを減らしても、イベント時などユーザアクセスは来ると思いますが? サーバの上のLBやproxyでアクセス流入数を制限しろって事ですか? MaxClientsになっているなら、その際はユーザにとっては真っ白ページかページが見れないですね
NOTEPAD

2016/10/06 06:34

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

2016/10/06 06:44

>MPM のモジュールによると思います。 prefork なら MaxClients でしょうか。 こう記載していますね MaxClients を減らしても、イベント時などはそれを超えた流入が来ます なので apacheエラーログではMaxClients エラーは出ますし その時はページ表示も出来ないはずです この解釈が違うのでしょうか
NOTEPAD

2016/10/06 06:57

イベント時ってなんだろう・・ prefork で MaxClients を指定してもそれ以上の子プロセスが起動できるということであれば私の知識が間違っていました。逆に勉強になりました。 ページが表示できるかどうかは今回の本題にはないと思います。 再起動してるんだからページ表示させたいんだろうとは思いましたが。 どうしてもプロセス切るのであれば、全部切るんじゃあなくて、プロセスごとの通信の状況を見て1個ずつ切った方がいいかと思います。
退会済みユーザー

退会済みユーザー

2016/10/06 09:07

> tk_flavor このやり取りを見ていて私もNOTEPADさんと同様に「再起動する理由」がよく分からないです。 > over MaxClients となれば、アクセス出来ないからです とありますが、結局再起動後に同じことになりませんか? それとも苦肉の応急処置ということなのでしょうか?それなら分かりますが。
guest

0

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

あと、

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

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

投稿2016/10/06 05:00

編集2016/10/06 05:29
otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tk_flavor

2016/10/06 05:55

エラーメッセージを拾えばいいのですね 再起動後のapacheプロセス起動数です
otn

2016/10/06 05:59

> 再起動後のapacheプロセス起動数です ということは、質問文のスクリプトを間違えて載せたと言うことですか? 正しいものに差し替えて下さい。
tk_flavor

2016/10/06 06:46

apache再起動処理後に、起動されているapacheプロセス数を表示する $PROCESS_NAME is $count を記載しています この内容に不備があるとの事でしょうか
otn

2016/10/06 07:13

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

2016/10/06 07:54

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

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 04:58

編集2016/10/06 05:05
ynakano

総合スコア1894

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tk_flavor

2016/10/06 06:22

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

2016/10/06 06:34

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

2016/10/06 06:41

すみません crontabに下記を記載しました ありがとうございました SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin HOME=/
ynakano

2016/10/06 06:47

記述を追加したのは良いのですが、他に影響が出ませんかね… また、記載した後は上手くいったのでしょうか? それほど複雑な処理をしている訳でもないですし、シェルスクリプト単体の問題として解決した方がいいような気がします。 あと追加で一つコメントを。 私がシェルスクリプトを書くときは、コマンドは全てフルパスで指定します。 (スクリプト先頭付近に変数化しますが) パスが通っていないとか、意図しないalias(たとえば"rm"が"rm -i"とか)に引っかからないためです。
tk_flavor

2016/10/06 06:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問