我需要有关如何改进以下脚本以获得更高效率(时间和资源以及更好的错误检测)的建议。以下是脚本执行操作的简单说明:
功能:脚本在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
答案 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