【发布时间】:2018-03-16 05:13:09
【问题描述】:
我正在尝试构建一个简单的 bash 脚本,以便在工作中自动运行一些月度 SAS 程序。我遇到的问题是我们喜欢根据程序运行的日期保留日志,以防基础数据发生变化,但我找不到将日期附加到日志文件的方法。
我的基本代码如下:
#!/bin/bash
month=`date +%Y%m -d "1 month ago"` #Previous month for log folder
sysdate=`date "+%Y_%m_%d"` #today's date
sasbatdir=/c01/sasdata/public
sasdir=/n04/directory-where-programs-are
saslog=/n04/directory-where-programs-are/Log/$month
cd $sasdir
$sasbatdir/batchsas.sh -s PROGRAM_01.sas -o $saslog -k traditional
$sasbatdir/batchsas.sh -s PROGRAM_02.sas -o $saslog -k traditional
$sasbatdir/batchsas.sh -s PROGRAM_03.sas -o $saslog -k traditional
... etc
exit 0
所以上面的方法有效,但它显然只输出名称为 PROGRAM_01.log、PROGRAM_02.log 等格式的日志文件,这些文件在该月下次运行脚本时会被覆盖。
我尝试过的事情:
$sasbatdir/batchsas.sh -s PROGRAM_01.sas -o $saslog/PROGRAM_01_"$sysdate".log -k traditional
和
$sasbatdir/batchsas.sh -s PROGRAM_01.sas -log $saslog/PROGRAM_01_"$sysdate".log -k traditional
不起作用。 nohup 返回“未找到输出目录”错误,并且似乎将日志名称视为目录而不是文件。
$sasbatdir/batchsas.sh -s PROGRAM_01.sas -o -t 1 > $saslog/PROGRAM_01_"$sysdate".log -k traditional 2>&1
大部分工作,但返回两个日志文件:一个具有正确名称,但仅包含 nohup 输出,另一个具有 SAS 日志,但包含日期(格式错误)和作业 ID附加。删除 2>$1 可以防止写入。老实说,我会选择第二个,如果我能弄清楚如何在没有第一个的情况下生成它,但我更愿意坚持 Program_Name_YYYY_MM_DD.log 格式。
如果相关,我用来测试程序的命令是nohup /n04/directory-where-program-is-stored/test_script.sh
【问题讨论】:
-
如果上面第一个代码按照你描述的方式工作,那说明
-o标签后面的参数是输出日志的目录,而不是文件名,好像是与-s之后的参数相同,其中扩展名.sas被.log替换。到目前为止我的假设。但是随后您引入了其他类型的论点:-t,-log,无需解释。由于我们没有batchsas.sh的来源,我们不知道这些选项在做什么,如果您不提供有关batchsas.sh参数的更多信息,我们将无法为您提供进一步的帮助 -
什么是 sasbatch.sh ?为什么不直接调用 sas.exe?这与使用网格有关吗?
-
@Tom sasbatch.sh 是我无法直接访问的内部脚本,但有人告诉我要指向我的 shell 脚本。它可能与使用网格有关,是的。 @PierreFrançois
-log显然是从命令行调用时 SAS 通常用于此目的的运算符。我尝试了它,因为我能找到的大多数网站都含糊其辞地使用它,但它似乎不适用于 batchsas 脚本。-t同样是我在打猎时遇到的。 -
啊,解决了。感谢您指出 sasbatch.sh 脚本中定义的选项;我一直假设这只是使用已经存在的运算符。
标签: bash unix sas batch-processing