#!/bin/bash
#--------------------------------------------------------------------------
daily="FILE_PATH/Daily"
weekly="/FILE_PATH/Weekly"
semianually="/FILE_PATH/SemiAnnually"
_endDate=$(date +"%m%d%Y")
_day=$(date +"%u")
if [ $_day -ge 1 ] || [ $_day -le 7 ]
then
backNumDays="180"
directory=$semianually
_beginDate=$(date -d "183 days ago" +"%m%d%Y")
report="$_beginDate-$_endDate"SemiAnnualReport".csv"
else
:
fi
if [ $_day -ge 1 ] || [ $_day -le 7 ]
then
backNumDays="7"
directory=$weekly
_beginDate=$(date -d "7 days ago" +"%m%d%Y")
report="$_beginDate-$_endDate"WeeklyReport".csv"
else
:
fi
if [ $_day -ge 1 ] || [ $_day -le 7 ]
then
backNumDays="1"
directory=$daily
_beginDate=$(date -d "1 day ago" +"%m%d%Y")
report="$_beginDate-$_endDate"DailyReport".csv"
fi
#_____sql query_______
exec_file_Report()
{
status=`/SIDS/app/oracle/product/12.1.0.2/client/bin/sqlplus -S << +++
$DB_CONNECT
--
SET head on
SET feedback OFF
SET pagesize 10000
SET linesize 2000;
SET colsep ,
set trimspool on
set trimout on
set trims on
set UNDERLINE OFF
set verify off
set echo off
set term off
spool "$directory/$report"
SELECT * FROM TABLE_NAME WHERE rownum <= $backNumDays
;
spool off
exit
+++
`
}
exec_file_Report
毎日のレポートが生成される理由がわかりません。 cronは、毎日、日曜日、毎週、毎月最後の日、半年ごとに実行するように設定されています。すべてのifに同じパラメータを使用する理由は、複数の状況が発生した場合(たとえば、日曜日が月の最後の日でもある場合)にコードをテストするためです。
答え1
何かが欠けているかもしれませんが、スクリプトが実行されるたびに3つのレポートをすべて生成したいと思います(このテストバージョン)。ただし、1回の呼び出しで複数のレポートを生成するようにスクリプトが設定されていません。スクリプトの実行時に発生する一般的なフローは次のとおりです。
もし(条件は常に真) それから returnNumDays="180" ディレクトリ = "$半年" ︙ その他 : フィリピン諸島 もし(条件は常に真) それから 戻り日数 = "7" ディレクトリ="毎週$" ︙ その他 : フィリピン諸島 もし(条件は常に真) それから 戻り日数 = "1" ディレクトリ="$daily" ︙ フィリピン諸島 (毎日のレポート生成)
あなたは次のことをする必要があります
(定義 実行ファイルの報告 機能) もし(今月の最後の日です) それから returnNumDays="180" ディレクトリ = "$半年" ︙ 実行ファイルの報告 フィリピン諸島 もし(今日は日曜日です) それから 戻り日数 = "7" ディレクトリ="毎週$" ︙ 実行ファイルの報告 フィリピン諸島 戻り日数 = "1" ディレクトリ="$daily" ︙ 実行ファイルの報告
このスクリプトできる1 つの通貨で 3 つのレポートをすべて生成します。たとえば、2月10日、2月17日、2月24日、3月3日、3月10日、3月17日、3月24日(毎週日曜日)に毎月、毎日のレポートが作成されます。半期報告書と日報は2月28日に作成される予定だ。 3月31日日曜日には3つすべてが達成されます。したがって、毎日スクリプトを実行するだけです。 3つのcronラインは必要ありません。
ここで、上記の報告日のうち、日次報告書は午後2時に生成され、他の報告書は午後11時59分に生成されることを想定しています。これらの詳細は、私が説明を求めるときに質問に含める必要がありました。この問題を解決するには、スクリプトをよりスマートにまたはよりスマートにする必要があります。あまり賢くすることをお勧めします。代わりに変えてください調べるどのレポートを生成したいのですが、パラメータを使用してどのレポートを生成するかを教えてください。このような:
(定義 実行ファイルの報告 機能) ケース '$1' (6ヶ月に1回) returnNumDays="180" ディレクトリ = "$半年" ︙ 実行ファイルの報告 ;;; (週間) 戻り日数 = "7" ディレクトリ="毎週$" ︙ 実行ファイルの報告 ;;; (毎日) 戻り日数 = "1" ディレクトリ="$daily" ︙ 実行ファイルの報告 ;;; イサク
次に、現在持っているcrontabエントリを維持し、パラメータを追加します。
0 14 * * * /パス/to/your/script毎日 59 23 * * 0 /パス/to/your/script週間 59 23 (最後) * * /パス/to/your/script6ヶ月に1回
うーん - 毎月末にジョブを実行するためにcronをどのように使用しますか?
警告:上記をテストしていません。
メモ:
- これを行う理由はありません
else :
。 if
毎回実行したいコードに対して常にtrueの条件をテストするためにanを使用する理由はありません。exec
Unix システム関数およびシェルコマンドの名前です。これを関数名の一部として使用すると混乱する可能性があります。