2016-03-27 2 views
0

目的: Unixスクリプトは2日以上経過したログをアーカイブする必要があります。ログをアーカイブするUnixスクリプト - 1つでも失敗した場合でもすべてのコマンドを実行する

問題:アーカイブまたはファイルの移動中にファイルが存在しない場合でも、スクリプト全体を実行する必要があります。

スクリプトファイルの内容: archivelogs.sh

find /logs/tomcat/*.* -type f -name "*.*" -mtime +2 -print -exec gzip {} \; 
find /logs/tomcat/*.gz -exec mv -f '{}' /logs/tomcat/logsbkp/ \; 
find /logs/jboss/*.* -type f -name "*.*" -mtime +2 -print -exec gzip {} \; 
find /logs/jboss/*.gz -exec mv -f '{}' /logs/tomcat/logsbkp/ \; 

ソリューション: は親切に私は上記のコマンドが失敗した場合でも、実行されたすべてのコマンドをmaksureする方法を示唆しています。

注: 私のcrontabは、毎日午前12:00にジョブを実行します。

答えて

1

これらのコマンドをcrontabに追加することをお勧めします。上記のコマンドの出力をログファイルに取り込んでください。そしてgrepエラーやログファイルからいくつかの文字列を取得してエラーを取得し、ログファイルにエラーがある場合はmailxを使用してエラーをメールで送信します。これを行うcrontabジョブを作成し、すべてのアーカイブジョブが完了した後にスケジュールを設定します。

+0

これは良いオプションです.crontabにn日前のファイルを見つけてアーカイブするスクリプトを追加しました。 – Azhar

2

簡単な解決策は、この行をスクリプトに追加することです。

#!/bin/sh +e 

または

set +e 

あなたは、単一のシンプルで構成することができるパイプライン、あればすぐに-eオプション

終了]を設定

set -e 

を使用して、それを逆にすることができますコマンド、リスト、 または化合物mmandは035以外の値を返す ステータスです。失敗したコマンドが、 コマンドリストのすぐ後にある、またはuntilキーワードの一部である場合、シェルは終了しません。 で実行されたコマンドの一部またはifステートメントでテストの一部分 が実行されます。最後の& &または||のいずれかのコマンド、パイプライン内の最後のコマンド、または が反転されている場合を除き、すべてのコマンドがリストに含まれています。サブシェル以外の複合コマンド が、-eが無視されている間にコマンドが失敗したためにゼロ以外のステータスを返した場合、シェルは終了しません。 ERRのトラップが設定されている場合は、シェルが終了する前に が実行されます。

このオプションは、シェル環境と個別に各サブシェル環境に適用され、 原因サブシェルは サブシェル内のすべてのコマンドを実行する前に終了することがあります。

複合コマンドまたはシェル関数が-eが無視されるコンテキストで実行された場合、 複合コマンドまたは関数本体内で実行されるコマンドは、-e設定の影響を受けません。-eがあっても-setコマンドは失敗ステータスを返します。 複合コマンドまたはシェル関数が、-eが無視される コンテキストで実行中に-eを設定した場合、複合コマンドまたは関数呼び出しを含むコマンドが完了するまで、その設定は無効になります。 。

関連する問題