web-dev-qa-db-ja.com

Crontabでifステートメントを使用してアラートを生成する

さまざまなPHPスクリプトを実行する約100個のCronジョブが存在するサーバーがあります。当面のタスクは、PHPスクリプトの実行中にエラーが発生したときにアラートを生成することです。

クローンは次のように設定されています。

30 08 * * * /usr/bin/php /var/www/html/phpscirpt1.php > /var/www/html/phpscript1.log 2>&1

私が試したのは、最後に&&を配置することですが、これによりいずれかの方法でアラートメールが生成されます

30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 && <Generate Mail>

うまくいくはずの理想的なケースは

 /bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh

以下は、テスト目的の単なるサンプルです。

/bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1

testfile.shを実行すると、ディレクトリが作成されるだけです。上記のコマンドを初めて実行すると、echo $?は出力0を返しますが、スクリプトを実行するとエラーが記録されるため、コマンドを再度実行すると1が返されます。

mkdir: cannot create directory `/home/myUser/testdir': File exists

そして、基本的にこれは、cron内のスクリプトが失敗したときに、電子メールの形式でアラートを生成する必要があるということです。上記の例では、script.shにメールを送信するmail -sコマンドが含まれています。

しかし、完全なコマンドが実行されると、次のようなエラーが返されます

/bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh
-bash: [1: command not found

このエラーを解決するために提供できるガイダンスをいただければ幸いです。ありがとうございました

3
Mustafa Mujahid

基本的にあなたのソリューションは良いです。単純なbash構文エラーが発生しました。 '['と ']'文字の前後にスペースを入れる必要があります:

[ $? == 1 ]

私は私の箱でそれをテストしました、そしてそれは働きます。エラーコード1にのみ反応することが確実でない限り、エラーコードを0([$?-ne 0])としてテストすることもお勧めします。

3
Kalavan

次のいずれかが機能するはずです。

30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 || <Generate Mail>
30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 ; [ $? -ne 0 ] && <Generate Mail>

1つ目は、スクリプトからの戻り値に基づいた論理AND ||の代わりに、論理OR &&を使用します(0は成功、その他は失敗)。

2番目は、正常に機能するために[$?の間にスペースが必要でした。

0
David