编写脚本以获得更好的错误检测,时间和资源效率的更好方法?

时间:2013-07-12 06:31:21

标签: linux shell unix scripting

我需要有关如何改进以下脚本以获得更高效率(时间和资源以及更好的错误检测)的建议。以下是脚本执行操作的简单说明:

功能:脚本在crontab中为“ins”用户运行非常短时间,在“输入路径”中搜索.DAT文件。如果找到.dat文件,将其移动到“工作目录”,作为批处理执行,并在完成.dat文件的执行后将其移动到“输出文件夹”。 .dat文件包含一系列类似的命令,用于将数字插入数据库。

    #!/usr/bin/ksh

    def_path="/apps/ins/"
    env_path="/apps/ins/eir/bin"
    input_path="/apps/ins/eir/batch/input/"
    work_path="/apps/ins/eir/batch/working/"
    output_path="/apps/ins/eir/batch/output/"
    moved_path="/apps/ins/eir/batch/processed/"
    log="/apps/ins/BLA/log/"
    date=`date '+%d%b%y'`

    cd $input_path
    listcount=`ls -rt *.dat |wc -l`
    list=`ls -rt *.dat`
    echo "`date +%H:%M:%S`| Total No of DAT files available are # $listcount #\nName of the files are...\n         $list "  >> $log/$date.log  2>&1

    if [[ -e $def_path/.bla_processing ]];
    then
       echo "`date +%H:%M:%S`| Script is already running" >> $log/$date.log  2>&1
       exit
    fi

    for fname in `ls *.dat | awk -F. '{print $1}'`
    do

    touch $def_path/.bla_processing
    mv $input_path/$fname.dat $work_path/$fname.dat

    echo "##################################################"  >> $log/$date.log  2>&1
    echo "## Filename = $fname.dat ## Time = `date +%H:%M:%S` ##"  >> $log/$date.log  2>&1 
    echo "##################################################"  >> $log/$date.log  2>&1 
    cd $env_path
    . /apps/ins/.profile   >> $log/$date.log  2>&1
    echo "Username is `whoami`" >> $log/$date.log  2>&1

    $env_path/mip_cmd EXECUTE:$work_path/$fname.dat,$output_path/$fname.out,100; >> $log/$date.log  2>&1
    sleep 2
    echo "`date +%H:%M:%S`| Moving the file *** $fname.dat *** to path |$moved_path|"  >> $log/$date.log  2>&1 
    mv $work_path/$fname.dat $moved_path/$fname.dat.moved
    cmd_exec=`cat $output_path/$fname.out |grep ":" |wc -l`
    echo "`date +%H:%M:%S`| Total commands executed are `expr $cmd_exec / 2`"  >> $log/$date.log  2>&1 
    echo "`date +%H:%M:%S`| Total Sucessfully executed commands are `cat $output_path/$fname.out |grep         "C1:00000;" |wc -l`"  >> $log/$date.log  2>&1 
    echo "--------------------------------------------------"  >> $log/$date.log  2>&1
    echo "#### SCRIPT WILL PROCESS THE NEXT FILE ###########"  >> $log/$date.log  2>&1
    echo "--------------------------------------------------"  >> $log/$date.log  2>&1
    echo ""  >> $log/$date.log  2>&1
    rm $def_path/.bla_processing
    exit
    done

1 个答案:

答案 0 :(得分:1)

由于您使用“$ def_path / .bla_processing”作为锁定形式,因此在继续执行脚本的其余部分之前,您应该首先检查其存在性。

此外,“touch $ def_path / .bla_processing”和“rm $ def_path / .bla_processing”可以移出for循环。

您的代码现在正在做的是,只处理第一个文件,脚本将退出。因此,不需要在for循环结束时调用“exit”。

作为一个例子(在应用上述建议之后):

touch $def_path/.bla_processing
for fname in `ls *.dat | awk -F. '{print $1}'`
    ....
    # remove the call to exit
done
rm $def_path/.bla_processing