这是脚本arc_rem.sh(755权限),它在crontab中添加如下
00 0,3,6,9,12,15,18,21 * * * . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
和脚本arc_rem.sh如下
rm /BIAMD/arch01/usageprd/arch/old_arcs.log
cd /BIAMD/arch01/usageprd/arch
LGA=`sqlplus -s tcs384160/tcs#1234 <<\EOF
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v$archived_log;
exit;
EOF`
echo $LGA;
U_LIMIT=`expr $LGA - 35`;
L_LIMIT=`expr $U_LIMIT - 1000`;
echo $L_LIMIT;
echo $U_LIMIT;
LOOP_VAR=$L_LIMIT;
while [ $LOOP_VAR -le $U_LIMIT ];
do
ls /BIAMD/arch01/usageprd/arch/*_${LOOP_VAR}_*.arc >> /BIAMD/arch01/usageprd/arch/old_arcs.log;
LOOP_VAR=`expr $LOOP_VAR + 1`;
done;
rm `cat /BIAMD/arch01/usageprd/arch/old_arcs.log`
我尽可能包含绝对路径。
此脚本的此要求是删除早于序列的文件(上述脚本中的U_limit),它通过填充old_arcs.log并对该文件执行rm(最后一行代码)来实现此目的
注意到问题
1)每当cronjob以3小时的间隔执行它时,old_arcs的大小为0,因此没有文件被rm删除,但是当我手动执行时,脚本工作正常sh arcs_rem.sh它按预期填充old_arcs.log删除文件。
2) 当我在cronjob执行时执行ps -ef | grep sh时,o / p如下 它看起来像是同一个shell脚本的许多实例正在运行,不知道原因 并消耗更多的CPU
oracle 473 455 1 21:00:00 ? 335:37 sh - c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
oracle 614 485 1 15:00:01 ? 30:01 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
oracle 8278 8240 1 03:00:01 ? 150:37 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
oracle 18331 18171 1 18:00:01 ? 2:36 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null
oracle 1845 4464 0 06:00:01 ? 0:00 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
oracle 9887 9822 1 00:00:01 ? 189:59 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
如果有人能告诉我脚本或crontab配置有什么问题以及解决方法,这将非常有用
编辑:
我已经检查了所有循环变量并且它们正在更新,这可能是无限循环的原因
答案 0 :(得分:1)
./.cronprofile
之类的相对路径。ps
输出看起来你的cron作业无限期地运行,或者至少持续很长时间。你应该检查一个无限循环。 Cron并不关心脚本在启动另一个脚本时是否已经在运行。只需在循环中打印$LOOP_VAR
和$U_LIMIT
即可验证它们是否按预期更改。ls
output. ;
终止$()
而不是``
。set -o errexit -o noclobber -o nounset
以启用一些非常基本的错误处理。它们应该适用于任何POSIX shell。