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

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

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

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

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

1回答

4195閲覧

アクセスログの監視スクリプトを作成したいのですが。。。

natsu25

総合スコア46

bash

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

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

2クリップ

投稿2017/05/23 07:22

編集2017/05/24 04:31

毎時1分に動くジョブで特定のサーバにアクセスがあった場合にapacheのアクセスログから拾いメールを発報する監視スクリプトをシェルで作成したいのですが行き詰っています。
以下の3点を追加で実装したいのですがアドバイスをお願いできますでしょうか。

  • access="${start_date}~${end_date}"とaccess+=" ${j} acccess :${result}件"の間に改行を入れたい。
  • 今の実装だとhost変数に複数のIPを入れると入れた数だけのメールが発報されてしまうため1通にまとめたい。
  • ログのローテートが24:00に行われるため23:00~23:59のログは1日前のログから拾いたい。

bash

1#!/bin/bash 2from="xxxx@xxxx" 3address="xxxx@xxxx" 4host='111.11.111.11 222.22.222.22' 5end_date=`LANG=en_US.UTF-8 date "+%d/%b/%Y:%H:%M:%S"` 6start_date=`LANG=en_US.UTF-8 date -d '60 minutes ago' "+%d/%b/%Y:%H:%M:%S"` 7date=`date "+%Y-%m-%d"` 8accesslog="/apache/logs/access_log.$date" 9 10for j in $host 11do 12result=`ssh $j grep -v *.txt $accesslog | awk -F '\[\\\[\\\]\]' -v "end=$end_date" -v "start=$start_date" 'start < $2 && $2 <= end' 2> /dev/null | wc -l` 13 14 if [ $result -gt 0 ]; then 15 access="${start_date}${end_date}" 16 access+=" ${j} acccess :${result}件" 17 18 subject='access' 19 20 /usr/sbin/sendmail -t << mailbody 21Subject: $subject 22From: $from 23To: $address 24 25$sry_access 26mailbody 27 28 fi 29done

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

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

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

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

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

guest

回答1

0

ベストアンサー

テストしてませんがこんな感じで。
直近の60分じゃなくて、前の時の0分から59分までを見る事にします。直近の60分だと、月末またぎの時に面倒です。
あと、grep -v *.txtの意味がわからなかったので、grep -v txtにしておきました。

Bash

1#!/bin/bash 2FROM=xxxx@xxxx 3ADDRESS=xxxx@xxxx 4SUBJECT=access 5 6HOST='111.11.111.11 222.22.222.22' 7LOG=/apache/logs/access_log 8 9HOUR=$(date -d '60 minutes ago' +%H) 10if [ $HOUR = 23 ] 11then DATE=$(LC_ALL=C date -d '60 minutes ago' +%d/%b/%Y) 12 LOGFILE=$LOG.$(date -d '60 minutes ago' +%Y-%m-%d) 13else DATE=$(LC_ALL=C date +%d/%b/%Y) 14 LOGFILE=$LOG.$(date +%Y-%m-%d) 15fi 16 17TEXT= 18for J in $HOST 19do 20 RESULT=$(ssh $J grep -v txt $LOGFILE | fgrep "[$DATE:$HOUR:" | wc -l) 21 if [ "$RESULT" != 0 ] 22 then TEXT+=" ${J} acccess :${RESULT}23" 24 fi 25done 26 27if [ "$TEXT" != "" ] 28then 29 /usr/sbin/sendmail -t << mailbody 30Subject: $SUBJECT 31From: $FROM 32To: $ADDRESS 33 34$DATE:$HOUR:00:00~$DATE:$HOUR:59:59 35 36$TEXT 37mailbody 38fi

投稿2017/05/23 14:08

otn

総合スコア84538

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

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

natsu25

2017/05/26 02:59

ありがとうございます。解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問