私はbashスクリプトセットを書いています。
最初はwrapper
2つのスクリプトを呼び出します:do_something
とdo_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つの目標を持っています:
- プロセス全体のログを作成します。つまり、stdoutとstderrに送信されたすべての内容がスクリプトの毎日の実行を示すログファイルに含まれているため、
do_something
エラーを確認できるようになりますdo_something_else
。wrapper
- すべてのシステムに入れられるように
do_something
プリコンパイルしたいと思います。これにより、開発中にソースコードを保持し、本番環境で編集できないコードをすばやく実行できます。do_something_else
wrapper
/usr/bin
scp
可能ですか?
答え1
OPが目的の機能を失うことなくスクリプトでこの状況を処理する方法の例は次のとおりです。
複数の論理ブロックを同時に実行したり、一度に1つの論理ブロックを実行する機能。
これらのタスクをファイルに書き込む機能。
これは簡単な例です。スクリプト言語を他の言語と同様に扱い、体系的なコードを書くことで、突然その言語であらゆる種類の作業を行うことができます。ヒントは、関数の外側に緩い論理的な塊を置かないことです。簡単にアイテムを切り替えたり、他の代わりに使用したり、部分をデバッグしたり、ロギング関数を追加したりできます。これが私が一般的にすることである 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
ログファイル部分のすべて:exec
stdoutと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...