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

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

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

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

Q&A

解決済

1回答

2967閲覧

cron監視用のシェルスクリプトを作成したい

koichi8888

総合スコア24

bash

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

0グッド

1クリップ

投稿2018/12/11 07:00

編集2018/12/11 13:38

/var/log/cronの出力を監視するスクリプトを作成したいです。
下記のような出力でBEGINが出力されてからENDが出力されるまで一定時間経過した場合、
エラー判定をしたいのですが、実装方法が分からないので、ご教示いただけますでしょうか。

while read lineで一行ずつ、文字列を検索することはできるのですが、下記の実装方法がわかりません。
・出力をリアルタイムに監視する方法
・ENDが出力されるまで一定時間(ex. 1h)した場合、エラーを出力する方法

-----------------出力-----------------
Dec 11 15:10:01 <サービス名A> BEGIN-3209
Dec 11 15:10:01 <サービス名B> BEGIN-3210
Dec 11 15:10:01 <サービス名A> END-3209
Dec 11 15:10:01 <サービス名B> END-3210

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

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

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

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

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

maisumakun

2018/12/11 07:42

なぜ「/var/lib/cronの監視」という方法を取るのでしょうか。実行されるプログラムの側で対応する方が自然なような気がします。
guest

回答1

0

ベストアンサー

指摘が付いている通り、プログラム側で対応するのがよいですが、
起動されるプログラムに手を入れる事が不可能と言う事でしょうか?
その場合は、そのプログラムを呼び出すシェルスクリプトを作り、それをcron登録すればいいです。

Bash

1#!/bin/sh 2起動したいプログラム その引数 & 3PID=$! 4sleep 3600 5if test -e /proc/$PID 6then まだ終了していないときの処理 7fi

cronからメールが来る場合は、両方が終わってからメールが届きます。

なお、1時間の間にプロセスIDが一周してしまうようなシステムの場合は、これではだめなので、目印のファイルを作るなど工夫が必要になります。

#追記
けっこう難しいです。
tail -fで良いかと思ったら、それだとチェックするタイミングがない。until readとか初めて書きました。

checkの中のechoの部分が時間オーバーが見つかったときの処理です。
時間間隔は秒数で指定します。
質問に書かれていない、読み飛ばす項目があれば、readの引数で調整。

Bash

1declare -A TIMES 2declare -A SVCS 3TIMEAFTER=60*60 4 5check(){ 6 local time id 7 let time=$(date +%s) 8 for id in ${!TIMES[@]} 9 do 10 if [ ${TIMES[$id]} -lt $time ] 11 then 12 echo ID=$id SVC=${SVCS[$id]} の処理が時間経過 13 unset TIMES[$id] 14 unset SVCS[$id] 15 fi 16 done 17} 18 19while true 20do 21 until read yobi day hms service beginend 22 do 23 sleep 1 24 check 25 done 26 let time=$(date +%s -d "$yobi $day $hms")+$TIMEAFTER 27 case "$beginend" in 28 BEGIN-*) 29 id=${beginend##*-} 30 TIMES[$id]=$time 31 SVCS[$id]=$service 32 ;; 33 END-*) 34 id=${beginend##*-} 35 unset TIMES[$id] 36 unset SVCS[$id] 37 ;; 38 esac 39done < /var/log/cron

投稿2018/12/11 08:17

編集2018/12/11 15:10
otn

総合スコア84499

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

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

koichi8888

2018/12/11 08:34

ご回答ありがとうございます。実現したいこととしてはcronに登録しているタスクがあるのですが、そのタスクのログが/var/log/cronにBIGIN~とEND~で出力されます。そのEND~がBEGIN~が出力されてから1時間経過しても出力されない場合、メールを飛ばす等のエラー処理をしたいです。
otn

2018/12/11 11:37

指摘の意味がわからないと言うことですか?
koichi8888

2018/12/11 13:39

説明不足で申し訳ありません。指摘の意味はわかるのですが、プログラムを呼び出す設定ではないため、別の回答を頂ければと思い、環境の説明を致しました、前提として別ベンダーのサービスをインストールした際に自動的に登録されるcronのタスクで設定内容としてはスクリプトを実行する記載があり、そのスクリプトの改変はできない、cronの設定内容の改変もできない状態となります。そのため、こちらでスクリプトを作成し、cronのログからタスクの実行状態を監視する必要があります。
koichi8888

2018/12/11 13:42

想定としてはサービス名と末尾の番号でEND~の出力を監視し、1h出力がない場合、メールもしくはログ出力をしたいと考えております。
otn

2018/12/11 13:52

他のプログラムからcrontabに動的に追加されると言うことですかね。 そういう特殊な事態は想定できませんでした。 追記しておきます。
koichi8888

2018/12/14 03:37

追記ありがとうございます。実装方法としては、監視対象のログファイルから監視対象ログのみ別ファイルにリアルタイムで出力し、定期的にタイムスタンムからタスクが終了しているかを確認する形にしました。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問