#!/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
也许我遗漏了一些东西,但我想您希望脚本(的这个测试版本)在每次运行时生成所有三个报告。但该脚本并未设置为在一次调用中生成多个报告。运行脚本时发生的一般流程是
如果(条件始终为真) 然后 返回NumDays =“180” 目录=“$半年” ︙ 别的 : 菲 如果(条件始终为真) 然后 返回天数=“7” 目录=“每周$” ︙ 别的 : 菲 如果(条件始终为真) 然后 返回天数=“1” 目录=“$每日” ︙ 菲 (生成日报)
你需要做类似的事情
(定义 执行文件报告 功能) 如果(这是该月的最后一天) 然后 返回NumDays =“180” 目录=“$半年” ︙ 执行文件报告 菲 如果(今天是星期日) 然后 返回天数=“7” 目录=“每周$” ︙ 执行文件报告 菲 返回天数=“1” 目录=“$每日” ︙ 执行文件报告
这个脚本能在一次调用中生成所有三个报告。例如2月10日、2月17日、2月24日、3月3日、3月10日、3月17日、3月24日(均为星期日),会做月报和日报。 2月28日编制半年度报告和日报。 3 月 31 日星期日,这三件事都会完成。所以你只需要每天运行该脚本即可;你不需要三个 cron 行。
现在您说,在上述任何一个多报告日,您希望每日报告在下午 2 点生成,其他报告在晚上 11:59 生成。当我要求澄清时,这些细节应该包含在问题中。为了解决这个问题,您必须使脚本变得更智能或更不智能。我建议让它变得不那么聪明。改变它,而不是弄清楚本身要生成什么报告,而是采用一个参数告诉它要生成哪个报告。像这样的东西:
(定义 执行文件报告 功能) 案例“$1” (半年一次) 返回NumDays =“180” 目录=“$半年” ︙ 执行文件报告 ;; (每周) 返回天数=“7” 目录=“每周$” ︙ 执行文件报告 ;; (日常的) 返回天数=“1” 目录=“$每日” ︙ 执行文件报告 ;; 埃萨克
然后保留您现在拥有的 crontab 条目,但添加参数:
0 14 * * * /路径/到/你的/脚本日常的 59 23 * * 0 /路径/到/你的/脚本每周 59 23 (最后的) * * /路径/到/你的/脚本半年一次
嗯 — 您如何使用 cron 在该月的最后一天运行作业?
警告:我没有测试过以上内容。
笔记:
- 没有理由这样做
else :
。 - 没有理由使用 an
if
来测试始终为真的条件来处理您每次想要执行的代码。 exec
是 Unix 系统函数和 shell 命令的名称。使用它作为函数名称的一部分会令人困惑。