ログをコンパイルして保持するマルチスクリプトbashスクリプトの作成

ログをコンパイルして保持するマルチスクリプトbashスクリプトの作成

私はbashスクリプトセットを書いています。

最初はwrapper2つのスクリプトを呼び出します:do_somethingdo_something_else

擬似コードで:

$ wrapper
do_something
if exitcode of do_something = 0 then 
    do_something_else
else
    exit with error
fi

exit success

これにより、ログファイルが生成されます。

$ cat /var/logs/wrapper.log | tail -3
Deleting file 299
Deleting file 300
wrapper ran successfully on 01/01/18 00:01:00 GMT

私は2つの目標を持っています:

  1. プロセス全体のログを作成します。つまり、stdoutとstderrに送信されたすべての内容がスクリプトの毎日の実行を示すログファイルに含まれているため、do_somethingエラーを確認できるようになりますdo_something_elsewrapper
  2. すべてのシステムに入れられるようにdo_somethingプリコンパイルしたいと思います。これにより、開発中にソースコードを保持し、本番環境で編集できないコードをすばやく実行できます。do_something_elsewrapper/usr/binscp

可能ですか?

答え1

OPが目的の機能を失うことなくスクリプトでこの状況を処理する方法の例は次のとおりです。

  1. 複数の論理ブロックを同時に実行したり、一度に1つの論理ブロックを実行する機能。

  2. これらのタスクをファイルに書き込む機能。

これは簡単な例です。スクリプト言語を他の言語と同様に扱い、体系的なコードを書くことで、突然その言語であらゆる種類の作業を行うことができます。ヒントは、関数の外側に緩い論理的な塊を置かないことです。簡単にアイテムを切り替えたり、他の代わりに使用したり、部分をデバッグしたり、ロギング関数を追加したりできます。これが私が一般的にすることである error_handler() などです。余分な作業はほとんど必要ありません。つまり、ランダムに複数行に積み重ねられた作業ではなく、シンプルでクリーンでメンテナンスしやすいアプリケーションが完成するということです。

ファイル:私のもの

#!/usr/bin/env bash

logfile='logfile.log'

function main() {
  case "$1" in
    run-all)
      block_1
      block_2
      ;;
    run-1)
      block_1
      ;;
    run-2)
      block_2
      ;;
    *)
      echo 'No start option provided. Exiting'
      exit 1
      ;;
  esac
}
function block_1(){
  do_something

  if [ "$?" == 0 ]; then 
    do_something_else
    echo "Deleting file 299" >> $logfile
    echo "Deleting file 300" >> $logfile
    echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
  else
    exit "$?"
  fi
}
function block_2(){
  do_something

  if [ "$?" == 0 ]; then 
    do_something_else
    echo "Deleting file 299" >> $logfile
    echo "Deleting file 300" >> $logfile
    echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
  else
    exit "$?"
  fi
}
# $@ is the list of start arguments, which main will use
# with $1, $2, and so on.
main $@

次のように実行できます。

./my_stuff 'run-all'

もちろん、これは単なる例ですが、実際にあなたがすることは、ロジックを構成し、すべての言語で同じようにソートしてから、目的のタスクを実行することです。シェルスクリプトが使用および保守されるという前提で、シェルスクリプトを起動し、関数を使用して作成すると、他のプログラミングと同じくらい柔軟でメンテナンスが簡単であることがわかりました。

答え2

ログファイル部分のすべて:execstdoutとstderrをリダイレクトする場合、dateログファイル名に日付を入力する場合は次のとおりです。

#!/bin/bash
exec > /somedir/somelog.$(date +%F)
exec 2>&1

# output goes to the log file even if this is an external command
somecmd...     

関連情報