私のホームサーバーは、定期的に複数のシェルスクリプトを実行して、メンテナンスタスク(主にバックアップやその他のタスク)を実行します。エラーが発生した場合は、通知を受け取り、作業時間も記録したいと思います。
現在私の設定は次のとおりです。
- Cronは他のスクリプトを呼び出すシェルスクリプトを呼び出します(それほど複雑ではありません)。それぞれの作業にどれくらいの時間がかかるのか分からず、お互いに干渉したくないので、別々のcronプロジェクトではなく、1つのスクリプトを使用して複数のタスクを処理することにしました。
- 私のcron設定にはMAILTO行が含まれています。私は何のエラーも発生しません。
- ロギングはありません。私は時々バックアップが実際に存在することを確認します。
各スクリプトでファイル(またはsyslog)のロギングを実装できることがわかります。各スクリプトに個別にコーディングする必要がないように中央ポイントで定義する方法はありますか?
より良いモニタリングを達成する方法がわからない。私はログ分析システムがこれについて過剰だと思います。何人かの人々はshell / cronの代わりにJenkinsを介してスクリプトを実行することを提案しましたが、これはもっと難しいようです。
シンプルで良いオプションは何ですか?
ベストアンサー1
私は以下を実装しました。
- 標準出力で出力を有効にするか、個々のステップのカスタム出力を追加します。例:
- echo「バックアップ開始...」
- rsyncに関係なく&&echo "バックアップ成功" ||
- スクリプトの各ステップで戻りコードを確認し、すぐに下付き文字を終了するか続行し、スクリプトの最後にエラーコードを返します。
- すべての出力をログファイルにリダイレクトするメンテナンススクリプトのラッパーを作成し、メンテナンススクリプトにエラーがある場合は電子メールを受け取ります。
メンテナンススクリプトの例(シングルステップが中断されても終了しませんが、最終的にエラーを返します):
#!/bin/bash
RETURNCODE=0
echo "Execution started $(date)"
/root/do_something.sh || RETURNCODE=1
# (...)
exit $RETURNCODE
今私のcrontabの他のスクリプトを呼び出すラッパースクリプトの例:
#!/bin/bash
# exit on any error (there should not be any in this script)
set -e
LOGFILE="/var/log/my.log"
# redirect STDOUT and STDERR to logfile...
if /root/maintenance.sh > $LOGFILE 2>&1; then
# the colon ":" means: do nothing
:
else
# on error, send me an email
mail -s "maintenance script failed" [email protected] < "$LOGFILE"
fi